From 2a1346cacb1066d71b7fe886b0daaad454003c81 Mon Sep 17 00:00:00 2001 From: Disha Prakash Date: Tue, 17 Mar 2026 15:17:10 +0000 Subject: [PATCH] Docs: Re-organize samples and create a samples-hub --- .ci/lint-docs-source-page.sh | 68 +- .ci/lint-docs-tool-page.sh | 63 +- .github/release-please.yml | 14 +- .hugo/assets/scss/_styles_project.scss | 2 +- .hugo/assets/scss/components/_header.scss | 2 +- .hugo/assets/scss/components/_sidebar.scss | 45 + .hugo/layouts/docs/redirect.html | 11 + .hugo/layouts/partials/hooks/body-end.html | 24 +- .hugo/layouts/partials/search-input.html | 33 +- .../shortcodes/compatible-sources.html | 4 +- .hugo/layouts/shortcodes/list-db.html | 98 + .hugo/layouts/shortcodes/list-tools.html | 127 +- .hugo/layouts/shortcodes/samples-gallery.html | 364 + DEVELOPER.md | 2 +- README.md | 2 +- docs/en/_index.md | 4 +- .../build-with-mcp-toolbox/alloydb/_index.md | 7 - .../build-with-mcp-toolbox/bigquery/_index.md | 7 - .../build-with-mcp-toolbox/looker/_index.md | 7 - .../en/build-with-mcp-toolbox/neo4j/_index.md | 7 - docs/en/documentation/_index.md | 8 + .../configuration/_index.md | 0 .../configuration/authentication/_index.md | 0 .../configuration/authentication/google.md | 0 .../configuration/embedding-models/_index.md | 0 .../configuration/embedding-models/gemini.md | 0 .../configuration/prebuilt-configs/_index.md | 0 .../configuration/prompts/_index.md | 0 .../configuration/prompts/custom/_index.md | 0 .../configuration/sources/_index.md | 0 .../configuration/toolbox-ui/edit-headers.gif | Bin .../configuration/toolbox-ui/edit-headers.png | Bin .../configuration/toolbox-ui/index.md | 0 .../toolbox-ui/optional-param-checked.png | Bin .../toolbox-ui/optional-param-unchecked.png | Bin .../configuration/toolbox-ui/run-tool.gif | Bin .../configuration/toolbox-ui/tools.png | Bin .../configuration/toolbox-ui/toolsets.png | Bin .../configuration/tools/_index.md | 0 .../configuration/tools/invoke_tool.md | 0 .../configuration/toolsets/_index.md | 0 .../configuration/toolsets/generate_skill.md | 0 .../connect-to/_index.md | 6 +- .../connect-to/client-sdks/_index.md | 6 +- .../connect-to/client-sdks/go-sdk/_index.md | 2 + .../client-sdks/go-sdk/core/_index.md | 2 +- .../go-sdk/pre-post-processing/_index.md} | 8 +- .../go-sdk/pre-post-processing}/adk/agent.go | 0 .../go-sdk/pre-post-processing}/adk/go.mod | 0 .../go-sdk/pre-post-processing}/adk/go.sum | 0 .../go-sdk/pre-post-processing}/agent_test.go | 0 .../client-sdks/go-sdk/tbadk/_index.md | 2 +- .../client-sdks/go-sdk/tbgenkit/_index.md | 0 .../client-sdks/javascript-sdk/_index.md | 2 + .../client-sdks/javascript-sdk/adk/index.md | 2 +- .../client-sdks/javascript-sdk/core/index.md | 2 +- .../pre-post-processing/_index.md} | 6 +- .../pre-post-processing}/adk/agent.js | 0 .../adk/package-lock.json | 0 .../pre-post-processing}/adk/package.json | 0 .../pre-post-processing}/agent.test.js | 0 .../pre-post-processing}/langchain/agent.js | 0 .../langchain/package-lock.json | 0 .../langchain/package.json | 0 .../pre-post-processing/_index.md | 0 .../client-sdks/python-sdk/_index.md | 3 + .../client-sdks/python-sdk/adk/index.md | 0 .../client-sdks/python-sdk/core/index.md | 4 +- .../client-sdks/python-sdk/langchain/index.md | 2 +- .../python-sdk/llamaindex/index.md | 2 +- .../pre-post-processing}/__init__.py | 0 .../python-sdk/pre-post-processing/_index.md} | 8 +- .../pre-post-processing}/adk/agent.py | 0 .../pre-post-processing}/adk/requirements.txt | 0 .../pre-post-processing}/agent_test.py | 0 .../pre-post-processing}/langchain/agent.py | 0 .../langchain/requirements.txt | 0 .../connect-to/gemini-cli/_index.md | 0 .../connect-to/ides/_index.md | 0 .../connect-to/ides/alloydb_pg_admin_mcp.md | 22 + .../connect-to/ides/alloydb_pg_mcp.md | 22 + .../connect-to/ides/bigquery_mcp.md | 22 + .../ides/cloud_sql_mssql_admin_mcp.md | 0 .../connect-to/ides/cloud_sql_mssql_mcp.md | 22 + .../ides/cloud_sql_mysql_admin_mcp.md | 0 .../connect-to/ides/cloud_sql_mysql_mcp.md | 22 + .../connect-to/ides/cloud_sql_pg_admin_mcp.md | 0 .../connect-to/ides/cloud_sql_pg_mcp.md | 22 + .../connect-to/ides/firestore_mcp.md | 22 + .../connect-to/ides/looker_mcp.md | 0 .../connect-to/ides/mssql_mcp.md | 0 .../connect-to/ides/mysql_mcp.md | 0 .../connect-to/ides/neo4j_mcp.md | 0 .../connect-to/ides/postgres_mcp.md | 0 .../connect-to/ides/spanner_mcp.md | 22 + .../connect-to/ides/sqlite_mcp.md | 0 .../connect-to/mcp-client/_index.md | 8 +- .../connect-to/toolbox-sdks/_index.md | 19 + .../connect-to/toolbox-sdks/go-sdk/_index.md | 74 + .../toolbox-sdks/go-sdk/core/_index.md | 948 +++ .../go-sdk/pre-post-processing/_index.md | 42 + .../go-sdk/pre-post-processing/adk/agent.go | 158 + .../go-sdk/pre-post-processing/adk/go.mod | 44 + .../go-sdk/pre-post-processing/adk/go.sum | 132 + .../go-sdk/pre-post-processing/agent_test.go | 78 + .../toolbox-sdks/go-sdk/tbadk/_index.md | 699 ++ .../toolbox-sdks/go-sdk/tbgenkit/_index.md | 119 + .../toolbox-sdks/javascript-sdk/_index.md | 73 + .../toolbox-sdks/javascript-sdk/adk/index.md | 477 ++ .../toolbox-sdks/javascript-sdk/core/index.md | 520 ++ .../pre-post-processing/_index.md | 53 + .../pre-post-processing/adk/agent.js | 103 + .../pre-post-processing/adk/package-lock.json | 7508 +++++++++++++++++ .../pre-post-processing/adk/package.json | 16 + .../pre-post-processing/agent.test.js | 91 + .../pre-post-processing/langchain/agent.js | 109 + .../langchain/package-lock.json | 1603 ++++ .../langchain/package.json | 20 + .../pre-post-processing/_index.md | 79 + .../toolbox-sdks/python-sdk/_index.md | 102 + .../toolbox-sdks/python-sdk/adk/index.md | 251 + .../toolbox-sdks/python-sdk/core/index.md | 547 ++ .../python-sdk/langchain/index.md | 452 + .../python-sdk/llamaindex/index.md | 437 + .../pre-post-processing/__init__.py | 19 + .../python-sdk/pre-post-processing/_index.md | 51 + .../pre-post-processing/adk/agent.py | 137 + .../pre-post-processing/adk/requirements.txt | 3 + .../pre-post-processing/agent_test.py | 51 + .../pre-post-processing/langchain/agent.py | 116 + .../langchain/requirements.txt | 3 + .../deploy-to/_index.md | 0 .../deploy-to/cloud-run/_index.md | 0 .../deploy-to/docker/_index.md | 2 +- .../deploy-to/kubernetes/_index.md | 0 .../getting-started/_index.md | 35 +- .../getting-started}/colab_quickstart.ipynb | 0 .../getting-started}/local_quickstart.md | 4 +- .../getting-started}/local_quickstart_go.md | 4 +- .../getting-started}/local_quickstart_js.md | 4 +- .../getting-started}/mcp_quickstart/_index.md | 8 +- .../mcp_quickstart/inspector.png | Bin .../mcp_quickstart/inspector_tools.png | Bin .../quickstart/go/adkgo/go.mod | 0 .../quickstart/go/adkgo/go.sum | 0 .../quickstart/go/adkgo/quickstart.go | 0 .../quickstart/go/genAI/go.mod | 0 .../quickstart/go/genAI/go.sum | 0 .../quickstart/go/genAI/quickstart.go | 0 .../quickstart/go/genkit/go.mod | 0 .../quickstart/go/genkit/go.sum | 0 .../quickstart/go/genkit/quickstart.go | 0 .../quickstart/go/langchain/go.mod | 0 .../quickstart/go/langchain/go.sum | 0 .../quickstart/go/langchain/quickstart.go | 0 .../quickstart/go/openAI/go.mod | 0 .../quickstart/go/openAI/go.sum | 0 .../quickstart/go/openAI/quickstart.go | 0 .../quickstart/go/quickstart_test.go | 0 .../quickstart/js/adk/package-lock.json | 0 .../quickstart/js/adk/package.json | 0 .../quickstart/js/adk/quickstart.js | 0 .../quickstart/js/genAI/package-lock.json | 0 .../quickstart/js/genAI/package.json | 0 .../quickstart/js/genAI/quickstart.js | 0 .../quickstart/js/genkit/package-lock.json | 0 .../quickstart/js/genkit/package.json | 0 .../quickstart/js/genkit/quickstart.js | 0 .../quickstart/js/langchain/package-lock.json | 0 .../quickstart/js/langchain/package.json | 0 .../quickstart/js/langchain/quickstart.js | 0 .../js/llamaindex/package-lock.json | 0 .../quickstart/js/llamaindex/package.json | 0 .../quickstart/js/llamaindex/quickstart.js | 0 .../quickstart/js/quickstart.test.js | 0 .../quickstart/python/__init__.py | 0 .../quickstart/python/adk/quickstart.py | 0 .../quickstart/python/adk/requirements.txt | 0 .../quickstart/python/core/quickstart.py | 0 .../quickstart/python/core/requirements.txt | 0 .../quickstart/python/langchain/quickstart.py | 0 .../python/langchain/requirements.txt | 0 .../python/llamaindex/quickstart.py | 0 .../python/llamaindex/requirements.txt | 0 .../quickstart/python/quickstart_test.py | 0 .../quickstart/shared/cloud_setup.md | 0 .../quickstart/shared/configure_toolbox.md | 0 .../quickstart/shared/database_setup.md | 0 .../introduction/_index.md | 4 +- .../introduction/architecture.png | Bin .../monitoring/_index.md | 0 .../monitoring/export_telemetry.md | 0 .../monitoring/telemetry/index.md | 0 .../monitoring/telemetry/telemetry_flow.png | Bin .../monitoring/telemetry/telemetry_traces.png | Bin docs/en/integrations/_index.md | 3 + docs/en/integrations/alloydb-admin/_index.md | 48 +- docs/en/integrations/alloydb-admin/source.md | 48 + .../alloydb-admin/tools/_index.md | 4 + .../{ => tools}/alloydb-create-cluster.md | 2 +- .../{ => tools}/alloydb-create-instance.md | 2 +- .../{ => tools}/alloydb-create-user.md | 2 +- .../{ => tools}/alloydb-get-cluster.md | 2 +- .../{ => tools}/alloydb-get-instance.md | 2 +- .../{ => tools}/alloydb-get-user.md | 2 +- .../{ => tools}/alloydb-list-clusters.md | 2 +- .../{ => tools}/alloydb-list-instances.md | 2 +- .../{ => tools}/alloydb-list-users.md | 2 +- .../{ => tools}/alloydb-wait-for-operation.md | 2 +- docs/en/integrations/alloydb/_index.md | 145 +- .../en/integrations/alloydb/samples/_index.md | 4 + .../samples}/ai-nl/alloydb_ai_nl.ipynb | 0 .../alloydb/samples}/ai-nl/index.md | 2 + .../alloydb/samples}/mcp_quickstart.md | 12 +- docs/en/integrations/alloydb/source.md | 145 + docs/en/integrations/alloydb/tools/_index.md | 4 + .../alloydb/{ => tools}/alloydb-ai-nl.md | 4 +- .../alloydb/tools/postgres-tools.md | 8 + docs/en/integrations/bigquery/_index.md | 142 +- .../integrations/bigquery/samples/_index.md | 5 + .../samples}/colab_quickstart_bigquery.ipynb | 0 .../bigquery/samples}/local_quickstart.md | 4 +- .../samples}/mcp_quickstart/_index.md | 6 +- .../samples}/mcp_quickstart/inspector.png | Bin .../mcp_quickstart}/inspector_tools.png | Bin docs/en/integrations/bigquery/source.md | 143 + docs/en/integrations/bigquery/tools/_index.md | 4 + .../bigquery-analyze-contribution.md | 2 +- .../bigquery-conversational-analytics.md | 2 +- .../{ => tools}/bigquery-execute-sql.md | 2 +- .../bigquery/{ => tools}/bigquery-forecast.md | 2 +- .../{ => tools}/bigquery-get-dataset-info.md | 2 +- .../{ => tools}/bigquery-get-table-info.md | 2 +- .../{ => tools}/bigquery-list-dataset-ids.md | 2 +- .../{ => tools}/bigquery-list-table-ids.md | 2 +- .../{ => tools}/bigquery-search-catalog.md | 2 +- .../bigquery/{ => tools}/bigquery-sql.md | 2 +- docs/en/integrations/bigtable/_index.md | 74 +- docs/en/integrations/bigtable/source.md | 75 + docs/en/integrations/bigtable/tools/_index.md | 4 + .../bigtable/{ => tools}/bigtable-sql.md | 2 +- docs/en/integrations/cassandra/_index.md | 59 +- docs/en/integrations/cassandra/source.md | 60 + .../en/integrations/cassandra/tools/_index.md | 4 + .../cassandra/{ => tools}/cassandra-cql.md | 2 +- docs/en/integrations/clickhouse/_index.md | 88 +- docs/en/integrations/clickhouse/source.md | 89 + .../integrations/clickhouse/tools/_index.md | 4 + .../{ => tools}/clickhouse-execute-sql.md | 2 +- .../{ => tools}/clickhouse-list-databases.md | 2 +- .../{ => tools}/clickhouse-list-tables.md | 2 +- .../clickhouse/{ => tools}/clickhouse-sql.md | 2 +- .../en/integrations/cloud-sql-admin/_index.md | 47 +- .../en/integrations/cloud-sql-admin/source.md | 48 + .../cloud-sql-admin/tools/_index.md | 4 + .../{ => tools}/cloudsqlcloneinstance.md | 2 +- .../{ => tools}/cloudsqlcreatebackup.md | 2 +- .../{ => tools}/cloudsqlcreatedatabase.md | 2 +- .../{ => tools}/cloudsqlcreateusers.md | 2 +- .../{ => tools}/cloudsqlgetinstances.md | 2 +- .../{ => tools}/cloudsqllistdatabases.md | 2 +- .../{ => tools}/cloudsqllistinstances.md | 2 +- .../cloudsqlmssqlcreateinstance.md | 2 +- .../cloudsqlmysqlcreateinstance.md | 2 +- .../{ => tools}/cloudsqlpgcreateinstances.md | 2 +- .../{ => tools}/cloudsqlpgupgradeprecheck.md | 2 +- .../{ => tools}/cloudsqlrestorebackup.md | 2 +- .../{ => tools}/cloudsqlwaitforoperation.md | 2 +- .../en/integrations/cloud-sql-mssql/_index.md | 113 +- .../en/integrations/cloud-sql-mssql/source.md | 113 + .../cloud-sql-mssql/tools/_index.md | 4 + .../cloud-sql-mssql/tools/mssql-tools.md | 8 + .../en/integrations/cloud-sql-mysql/_index.md | 141 +- .../en/integrations/cloud-sql-mysql/source.md | 141 + .../cloud-sql-mysql/tools/_index.md | 4 + .../cloud-sql-mysql/tools/mysql-tools.md | 8 + docs/en/integrations/cloud-sql-pg/_index.md | 147 +- docs/en/integrations/cloud-sql-pg/source.md | 147 + .../integrations/cloud-sql-pg/tools/_index.md | 4 + .../cloud-sql-pg/tools/postgres-tools.md | 8 + docs/en/integrations/cloudgda/_index.md | 44 +- docs/en/integrations/cloudgda/source.md | 45 + docs/en/integrations/cloudgda/tools/_index.md | 4 + .../cloudgda/{ => tools}/cloud-gda-query.md | 2 +- .../en/integrations/cloudhealthcare/_index.md | 124 +- .../en/integrations/cloudhealthcare/source.md | 124 + .../cloudhealthcare/tools/_index.md | 4 + .../cloud-healthcare-fhir-fetch-page.md | 2 +- ...loud-healthcare-fhir-patient-everything.md | 2 +- .../cloud-healthcare-fhir-patient-search.md | 2 +- .../cloud-healthcare-get-dataset.md | 2 +- ...loud-healthcare-get-dicom-store-metrics.md | 2 +- .../cloud-healthcare-get-dicom-store.md | 2 +- .../cloud-healthcare-get-fhir-resource.md | 2 +- ...cloud-healthcare-get-fhir-store-metrics.md | 2 +- .../cloud-healthcare-get-fhir-store.md | 2 +- .../cloud-healthcare-list-dicom-stores.md | 2 +- .../cloud-healthcare-list-fhir-stores.md | 2 +- ...thcare-retrieve-rendered-dicom-instance.md | 2 +- ...cloud-healthcare-search-dicom-instances.md | 2 +- .../cloud-healthcare-search-dicom-series.md | 2 +- .../cloud-healthcare-search-dicom-studies.md | 2 +- .../integrations/cloudloggingadmin/_index.md | 65 +- .../integrations/cloudloggingadmin/source.md | 66 + .../cloud-logging-admin-list-log-names.md | 2 +- ...cloud-logging-admin-list-resource-types.md | 2 +- .../cloud-logging-admin-query-logs.md | 2 +- .../en/integrations/cloudmonitoring/_index.md | 46 +- .../en/integrations/cloudmonitoring/source.md | 47 + .../cloudmonitoring/tools/_index.md | 4 + .../cloud-monitoring-query-prometheus.md | 8 +- docs/en/integrations/cockroachdb/_index.md | 231 +- docs/en/integrations/cockroachdb/source.md | 232 + .../integrations/cockroachdb/tools/_index.md | 4 + .../{ => tools}/cockroachdb-execute-sql.md | 2 +- .../{ => tools}/cockroachdb-list-schemas.md | 2 +- .../{ => tools}/cockroachdb-list-tables.md | 2 +- .../{ => tools}/cockroachdb-sql.md | 2 +- docs/en/integrations/couchbase/_index.md | 56 +- docs/en/integrations/couchbase/source.md | 57 + .../en/integrations/couchbase/tools/_index.md | 4 + .../couchbase/{ => tools}/couchbase-sql.md | 2 +- docs/en/integrations/dataform/_index.md | 2 - docs/en/integrations/dataform/tools/_index.md | 4 + .../{ => tools}/dataform-compile-local.md | 2 +- docs/en/integrations/dataplex/_index.md | 367 +- docs/en/integrations/dataplex/source.md | 368 + docs/en/integrations/dataplex/tools/_index.md | 4 + .../{ => tools}/dataplex-lookup-entry.md | 2 +- .../dataplex-search-aspect-types.md | 2 +- .../{ => tools}/dataplex-search-entries.md | 2 +- docs/en/integrations/dgraph/_index.md | 79 +- docs/en/integrations/dgraph/source.md | 80 + docs/en/integrations/dgraph/tools/_index.md | 4 + .../dgraph/{ => tools}/dgraph-dql.md | 2 +- docs/en/integrations/elasticsearch/_index.md | 78 +- docs/en/integrations/elasticsearch/source.md | 79 + .../elasticsearch/tools/_index.md | 4 + .../{ => tools}/elasticsearch-esql.md | 2 +- docs/en/integrations/firebird/_index.md | 61 +- docs/en/integrations/firebird/source.md | 62 + docs/en/integrations/firebird/tools/_index.md | 4 + .../{ => tools}/firebird-execute-sql.md | 2 +- .../firebird/{ => tools}/firebird-sql.md | 2 +- docs/en/integrations/firestore/_index.md | 83 +- docs/en/integrations/firestore/source.md | 84 + .../en/integrations/firestore/tools/_index.md | 4 + .../{ => tools}/firestore-add-documents.md | 2 +- .../{ => tools}/firestore-delete-documents.md | 2 +- .../{ => tools}/firestore-get-documents.md | 2 +- .../{ => tools}/firestore-get-rules.md | 2 +- .../{ => tools}/firestore-list-collections.md | 2 +- .../{ => tools}/firestore-query-collection.md | 2 +- .../firestore/{ => tools}/firestore-query.md | 2 +- .../{ => tools}/firestore-update-document.md | 2 +- .../{ => tools}/firestore-validate-rules.md | 2 +- docs/en/integrations/http/_index.md | 56 +- docs/en/integrations/http/source.md | 56 + docs/en/integrations/http/tools/_index.md | 4 + .../http/{ => tools}/http-tool.md | 2 +- docs/en/integrations/looker/_index.md | 113 +- docs/en/integrations/looker/samples/_index.md | 4 + .../looker/samples}/looker_gemini.md | 4 +- .../samples}/looker_gemini_oauth/_index.md | 2 + .../looker_gemini_oauth/authenticated.png | Bin .../looker_gemini_oauth/authorize.png | Bin .../looker_gemini_oauth/registration.png | Bin .../samples}/looker_mcp_inspector/_index.md | 4 +- .../looker_mcp_inspector/inspector.png | Bin .../looker_mcp_inspector}/inspector_tools.png | Bin docs/en/integrations/looker/source.md | 114 + docs/en/integrations/looker/tools/_index.md | 4 + .../looker-add-dashboard-element.md | 2 +- .../looker-add-dashboard-filter.md | 2 +- .../looker-conversational-analytics.md | 2 +- .../looker-create-project-directory.md | 2 +- .../{ => tools}/looker-create-project-file.md | 2 +- .../looker-delete-project-directory.md | 2 +- .../{ => tools}/looker-delete-project-file.md | 2 +- .../looker/{ => tools}/looker-dev-mode.md | 2 +- .../{ => tools}/looker-generate-embed-url.md | 2 +- .../looker-get-connection-databases.md | 2 +- .../looker-get-connection-schemas.md | 2 +- .../looker-get-connection-table-columns.md | 2 +- .../looker-get-connection-tables.md | 2 +- .../{ => tools}/looker-get-connections.md | 2 +- .../{ => tools}/looker-get-dashboards.md | 2 +- .../{ => tools}/looker-get-dimensions.md | 2 +- .../looker/{ => tools}/looker-get-explores.md | 2 +- .../looker/{ => tools}/looker-get-filters.md | 2 +- .../looker/{ => tools}/looker-get-looks.md | 2 +- .../looker/{ => tools}/looker-get-measures.md | 2 +- .../looker/{ => tools}/looker-get-models.md | 2 +- .../{ => tools}/looker-get-parameters.md | 2 +- .../looker-get-project-directories.md | 2 +- .../{ => tools}/looker-get-project-file.md | 2 +- .../{ => tools}/looker-get-project-files.md | 2 +- .../looker/{ => tools}/looker-get-projects.md | 2 +- .../{ => tools}/looker-health-analyze.md | 2 +- .../looker/{ => tools}/looker-health-pulse.md | 2 +- .../{ => tools}/looker-health-vacuum.md | 2 +- .../{ => tools}/looker-make-dashboard.md | 2 +- .../looker/{ => tools}/looker-make-look.md | 2 +- .../looker/{ => tools}/looker-query-sql.md | 2 +- .../looker/{ => tools}/looker-query-url.md | 2 +- .../looker/{ => tools}/looker-query.md | 2 +- .../{ => tools}/looker-run-dashboard.md | 2 +- .../looker/{ => tools}/looker-run-look.md | 2 +- .../{ => tools}/looker-update-project-file.md | 2 +- .../{ => tools}/looker-validate-project.md | 2 +- docs/en/integrations/mariadb/_index.md | 63 +- docs/en/integrations/mariadb/source.md | 64 + docs/en/integrations/mariadb/tools/_index.md | 4 + .../integrations/mariadb/tools/mysql-tools.md | 8 + docs/en/integrations/mindsdb/_index.md | 195 +- docs/en/integrations/mindsdb/source.md | 196 + docs/en/integrations/mindsdb/tools/_index.md | 4 + .../{ => tools}/mindsdb-execute-sql.md | 2 +- .../mindsdb/{ => tools}/mindsdb-sql.md | 2 +- docs/en/integrations/mongodb/_index.md | 38 +- docs/en/integrations/mongodb/source.md | 39 + docs/en/integrations/mongodb/tools/_index.md | 4 + .../mongodb/{ => tools}/mongodb-aggregate.md | 2 +- .../{ => tools}/mongodb-delete-many.md | 2 +- .../mongodb/{ => tools}/mongodb-delete-one.md | 2 +- .../mongodb/{ => tools}/mongodb-find-one.md | 2 +- .../mongodb/{ => tools}/mongodb-find.md | 2 +- .../{ => tools}/mongodb-insert-many.md | 2 +- .../mongodb/{ => tools}/mongodb-insert-one.md | 2 +- .../{ => tools}/mongodb-update-many.md | 2 +- .../mongodb/{ => tools}/mongodb-update-one.md | 2 +- docs/en/integrations/mssql/_index.md | 63 +- docs/en/integrations/mssql/source.md | 64 + docs/en/integrations/mssql/tools/_index.md | 4 + .../mssql/{ => tools}/mssql-execute-sql.md | 2 +- .../mssql/{ => tools}/mssql-list-tables.md | 2 +- .../mssql/{ => tools}/mssql-sql.md | 2 +- docs/en/integrations/mysql/_index.md | 66 +- docs/en/integrations/mysql/source.md | 67 + docs/en/integrations/mysql/tools/_index.md | 4 + .../mysql/{ => tools}/mysql-execute-sql.md | 2 +- .../mysql/{ => tools}/mysql-get-query-plan.md | 2 +- .../{ => tools}/mysql-list-active-queries.md | 2 +- .../mysql-list-table-fragmentation.md | 2 +- ...ysql-list-tables-missing-unique-indexes.md | 2 +- .../mysql/{ => tools}/mysql-list-tables.md | 2 +- .../mysql/{ => tools}/mysql-sql.md | 2 +- docs/en/integrations/neo4j/_index.md | 58 +- docs/en/integrations/neo4j/samples/_index.md | 4 + .../neo4j/samples}/mcp_quickstart.md | 3 +- docs/en/integrations/neo4j/source.md | 59 + docs/en/integrations/neo4j/tools/_index.md | 4 + .../neo4j/{ => tools}/neo4j-cypher.md | 2 +- .../neo4j/{ => tools}/neo4j-execute-cypher.md | 2 +- .../neo4j/{ => tools}/neo4j-schema.md | 2 +- docs/en/integrations/oceanbase/_index.md | 92 +- docs/en/integrations/oceanbase/source.md | 93 + .../en/integrations/oceanbase/tools/_index.md | 4 + .../{ => tools}/oceanbase-execute-sql.md | 2 +- .../oceanbase/{ => tools}/oceanbase-sql.md | 2 +- docs/en/integrations/oracle/_index.md | 169 +- docs/en/integrations/oracle/source.md | 170 + docs/en/integrations/oracle/tools/_index.md | 4 + .../oracle/{ => tools}/oracle-execute-sql.md | 2 +- .../oracle/{ => tools}/oracle-sql.md | 2 +- docs/en/integrations/postgres/_index.md | 67 +- docs/en/integrations/postgres/source.md | 67 + docs/en/integrations/postgres/tools/_index.md | 4 + .../{ => tools}/postgres-database-overview.md | 2 +- .../{ => tools}/postgres-execute-sql.md | 2 +- .../postgres-get-column-cardinality.md | 2 +- .../postgres-list-active-queries.md | 2 +- .../postgres-list-available-extensions.md | 2 +- .../postgres-list-database-stats.md | 2 +- .../{ => tools}/postgres-list-indexes.md | 2 +- .../postgres-list-installed-extensions.md | 2 +- .../{ => tools}/postgres-list-locks.md | 2 +- .../{ => tools}/postgres-list-pg-settings.md | 2 +- .../postgres-list-publication-tables.md | 2 +- .../{ => tools}/postgres-list-query-stats.md | 2 +- .../{ => tools}/postgres-list-roles.md | 2 +- .../{ => tools}/postgres-list-schemas.md | 2 +- .../{ => tools}/postgres-list-sequences.md | 2 +- .../postgres-list-stored-procedure.md | 2 +- .../{ => tools}/postgres-list-table-stats.md | 2 +- .../{ => tools}/postgres-list-tables.md | 2 +- .../{ => tools}/postgres-list-tablespaces.md | 2 +- .../{ => tools}/postgres-list-triggers.md | 2 +- .../{ => tools}/postgres-list-views.md | 2 +- .../postgres-long-running-transactions.md | 2 +- .../{ => tools}/postgres-replication-stats.md | 2 +- .../postgres/{ => tools}/postgres-sql.md | 2 +- docs/en/integrations/redis/_index.md | 108 +- docs/en/integrations/redis/source.md | 108 + docs/en/integrations/redis/tools/_index.md | 4 + .../redis/{ => tools}/redis-tool.md | 2 +- .../integrations/serverless-spark/_index.md | 59 +- .../integrations/serverless-spark/source.md | 60 + .../serverless-spark/tools/_index.md | 4 + .../serverless-spark-cancel-batch.md | 2 +- .../serverless-spark-create-pyspark-batch.md | 2 +- .../serverless-spark-create-spark-batch.md | 2 +- .../{ => tools}/serverless-spark-get-batch.md | 2 +- .../serverless-spark-get-session-template.md | 0 .../serverless-spark-list-batches.md | 2 +- docs/en/integrations/singlestore/_index.md | 67 +- docs/en/integrations/singlestore/source.md | 68 + .../integrations/singlestore/tools/_index.md | 4 + .../{ => tools}/singlestore-execute-sql.md | 2 +- .../{ => tools}/singlestore-sql.md | 2 +- docs/en/integrations/snowflake/_index.md | 61 +- .../integrations/snowflake/samples/_index.md | 4 + .../snowflake/samples}/runme.py | 0 .../snowflake/samples/sample.md} | 12 +- .../snowflake/samples}/snowflake-config.yaml | 0 .../snowflake/samples}/snowflake-env.sh | 2 +- .../snowflake/samples}/test-snowflake.sh | 8 +- docs/en/integrations/snowflake/source.md | 62 + .../en/integrations/snowflake/tools/_index.md | 4 + .../{ => tools}/snowflake-execute-sql.md | 2 +- .../snowflake/{ => tools}/snowflake-sql.md | 2 +- docs/en/integrations/spanner/_index.md | 76 +- docs/en/integrations/spanner/source.md | 77 + docs/en/integrations/spanner/tools/_index.md | 4 + .../{ => tools}/spanner-execute-sql.md | 2 +- .../{ => tools}/spanner-list-graphs.md | 2 +- .../{ => tools}/spanner-list-tables.md | 2 +- .../spanner/{ => tools}/spanner-sql.md | 2 +- docs/en/integrations/sqlite/_index.md | 79 +- docs/en/integrations/sqlite/source.md | 79 + docs/en/integrations/sqlite/tools/_index.md | 4 + .../sqlite/{ => tools}/sqlite-execute-sql.md | 2 +- .../sqlite/{ => tools}/sqlite-sql.md | 2 +- docs/en/integrations/tidb/_index.md | 96 +- docs/en/integrations/tidb/source.md | 97 + docs/en/integrations/tidb/tools/_index.md | 4 + .../tidb/{ => tools}/tidb-execute-sql.md | 2 +- .../integrations/tidb/{ => tools}/tidb-sql.md | 2 +- docs/en/integrations/trino/_index.md | 67 +- docs/en/integrations/trino/source.md | 68 + docs/en/integrations/trino/tools/_index.md | 4 + .../trino/{ => tools}/trino-execute-sql.md | 2 +- .../trino/{ => tools}/trino-sql.md | 2 +- docs/en/integrations/utility/_index.md | 2 - docs/en/integrations/utility/tools/_index.md | 4 + .../integrations/utility/{ => tools}/wait.md | 2 +- docs/en/integrations/valkey/_index.md | 75 +- docs/en/integrations/valkey/source.md | 75 + docs/en/integrations/valkey/tools/_index.md | 4 + .../valkey/{ => tools}/valkey-tool.md | 2 +- docs/en/integrations/yuagbytedb/_index.md | 53 +- docs/en/integrations/yuagbytedb/source.md | 54 + .../integrations/yuagbytedb/tools/_index.md | 4 + .../yuagbytedb/{ => tools}/yugabytedb-sql.md | 2 +- docs/en/reference/cli.md | 10 +- docs/en/reference/faq.md | 6 +- .../_index.md | 8 +- .../deploy_adk_agent.md | 12 +- .../prompts_quickstart_gemini_cli.md | 2 + docs/en/user-guide/_index.md | 8 - .../connect-to/ides/alloydb_pg_admin_mcp.md | 14 - .../connect-to/ides/alloydb_pg_mcp.md | 13 - .../connect-to/ides/bigquery_mcp.md | 13 - .../connect-to/ides/cloud_sql_mssql_mcp.md | 13 - .../connect-to/ides/cloud_sql_mysql_mcp.md | 13 - .../connect-to/ides/cloud_sql_pg_mcp.md | 13 - .../connect-to/ides/firestore_mcp.md | 14 - .../user-guide/connect-to/ides/spanner_mcp.md | 13 - 568 files changed, 20694 insertions(+), 4441 deletions(-) create mode 100644 .hugo/layouts/docs/redirect.html create mode 100644 .hugo/layouts/shortcodes/list-db.html create mode 100644 .hugo/layouts/shortcodes/samples-gallery.html delete mode 100644 docs/en/build-with-mcp-toolbox/alloydb/_index.md delete mode 100644 docs/en/build-with-mcp-toolbox/bigquery/_index.md delete mode 100644 docs/en/build-with-mcp-toolbox/looker/_index.md delete mode 100644 docs/en/build-with-mcp-toolbox/neo4j/_index.md create mode 100644 docs/en/documentation/_index.md rename docs/en/{user-guide => documentation}/configuration/_index.md (100%) rename docs/en/{user-guide => documentation}/configuration/authentication/_index.md (100%) rename docs/en/{user-guide => documentation}/configuration/authentication/google.md (100%) rename docs/en/{user-guide => documentation}/configuration/embedding-models/_index.md (100%) rename docs/en/{user-guide => documentation}/configuration/embedding-models/gemini.md (100%) rename docs/en/{user-guide => documentation}/configuration/prebuilt-configs/_index.md (100%) rename docs/en/{user-guide => documentation}/configuration/prompts/_index.md (100%) rename docs/en/{user-guide => documentation}/configuration/prompts/custom/_index.md (100%) rename docs/en/{user-guide => documentation}/configuration/sources/_index.md (100%) rename docs/en/{user-guide => documentation}/configuration/toolbox-ui/edit-headers.gif (100%) rename docs/en/{user-guide => documentation}/configuration/toolbox-ui/edit-headers.png (100%) rename docs/en/{user-guide => documentation}/configuration/toolbox-ui/index.md (100%) rename docs/en/{user-guide => documentation}/configuration/toolbox-ui/optional-param-checked.png (100%) rename docs/en/{user-guide => documentation}/configuration/toolbox-ui/optional-param-unchecked.png (100%) rename docs/en/{user-guide => documentation}/configuration/toolbox-ui/run-tool.gif (100%) rename docs/en/{user-guide => documentation}/configuration/toolbox-ui/tools.png (100%) rename docs/en/{user-guide => documentation}/configuration/toolbox-ui/toolsets.png (100%) rename docs/en/{user-guide => documentation}/configuration/tools/_index.md (100%) rename docs/en/{user-guide => documentation}/configuration/tools/invoke_tool.md (100%) rename docs/en/{user-guide => documentation}/configuration/toolsets/_index.md (100%) rename docs/en/{user-guide => documentation}/configuration/toolsets/generate_skill.md (100%) rename docs/en/{user-guide => documentation}/connect-to/_index.md (76%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/_index.md (88%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/go-sdk/_index.md (99%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/go-sdk/core/_index.md (99%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/go.md => documentation/connect-to/client-sdks/go-sdk/pre-post-processing/_index.md} (85%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/go => documentation/connect-to/client-sdks/go-sdk/pre-post-processing}/adk/agent.go (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/go => documentation/connect-to/client-sdks/go-sdk/pre-post-processing}/adk/go.mod (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/go => documentation/connect-to/client-sdks/go-sdk/pre-post-processing}/adk/go.sum (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/go => documentation/connect-to/client-sdks/go-sdk/pre-post-processing}/agent_test.go (100%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/go-sdk/tbadk/_index.md (99%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/go-sdk/tbgenkit/_index.md (100%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/javascript-sdk/_index.md (98%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/javascript-sdk/adk/index.md (99%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/javascript-sdk/core/index.md (99%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/js.md => documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/_index.md} (89%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/js => documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing}/adk/agent.js (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/js => documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing}/adk/package-lock.json (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/js => documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing}/adk/package.json (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/js => documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing}/agent.test.js (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/js => documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing}/langchain/agent.js (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/js => documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing}/langchain/package-lock.json (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/js => documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing}/langchain/package.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/connect-to/client-sdks}/pre-post-processing/_index.md (100%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/python-sdk/_index.md (99%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/python-sdk/adk/index.md (100%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/python-sdk/core/index.md (99%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/python-sdk/langchain/index.md (99%) rename docs/en/{user-guide => documentation}/connect-to/client-sdks/python-sdk/llamaindex/index.md (99%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/python => documentation/connect-to/client-sdks/python-sdk/pre-post-processing}/__init__.py (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/python.md => documentation/connect-to/client-sdks/python-sdk/pre-post-processing/_index.md} (88%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/python => documentation/connect-to/client-sdks/python-sdk/pre-post-processing}/adk/agent.py (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/python => documentation/connect-to/client-sdks/python-sdk/pre-post-processing}/adk/requirements.txt (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/python => documentation/connect-to/client-sdks/python-sdk/pre-post-processing}/agent_test.py (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/python => documentation/connect-to/client-sdks/python-sdk/pre-post-processing}/langchain/agent.py (100%) rename docs/en/{build-with-mcp-toolbox/pre-post-processing/python => documentation/connect-to/client-sdks/python-sdk/pre-post-processing}/langchain/requirements.txt (100%) rename docs/en/{user-guide => documentation}/connect-to/gemini-cli/_index.md (100%) rename docs/en/{user-guide => documentation}/connect-to/ides/_index.md (100%) create mode 100644 docs/en/documentation/connect-to/ides/alloydb_pg_admin_mcp.md create mode 100644 docs/en/documentation/connect-to/ides/alloydb_pg_mcp.md create mode 100644 docs/en/documentation/connect-to/ides/bigquery_mcp.md rename docs/en/{user-guide => documentation}/connect-to/ides/cloud_sql_mssql_admin_mcp.md (100%) create mode 100644 docs/en/documentation/connect-to/ides/cloud_sql_mssql_mcp.md rename docs/en/{user-guide => documentation}/connect-to/ides/cloud_sql_mysql_admin_mcp.md (100%) create mode 100644 docs/en/documentation/connect-to/ides/cloud_sql_mysql_mcp.md rename docs/en/{user-guide => documentation}/connect-to/ides/cloud_sql_pg_admin_mcp.md (100%) create mode 100644 docs/en/documentation/connect-to/ides/cloud_sql_pg_mcp.md create mode 100644 docs/en/documentation/connect-to/ides/firestore_mcp.md rename docs/en/{user-guide => documentation}/connect-to/ides/looker_mcp.md (100%) rename docs/en/{user-guide => documentation}/connect-to/ides/mssql_mcp.md (100%) rename docs/en/{user-guide => documentation}/connect-to/ides/mysql_mcp.md (100%) rename docs/en/{user-guide => documentation}/connect-to/ides/neo4j_mcp.md (100%) rename docs/en/{user-guide => documentation}/connect-to/ides/postgres_mcp.md (100%) create mode 100644 docs/en/documentation/connect-to/ides/spanner_mcp.md rename docs/en/{user-guide => documentation}/connect-to/ides/sqlite_mcp.md (100%) rename docs/en/{user-guide => documentation}/connect-to/mcp-client/_index.md (96%) create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/go-sdk/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/go-sdk/core/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/agent.go create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/go.mod create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/go.sum create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/agent_test.go create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/go-sdk/tbadk/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/go-sdk/tbgenkit/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/adk/index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/core/index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/agent.js create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/package-lock.json create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/package.json create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/agent.test.js create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/agent.js create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/package-lock.json create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/package.json create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/pre-post-processing/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/adk/index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/core/index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/langchain/index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/llamaindex/index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/__init__.py create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/_index.md create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/adk/agent.py create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/adk/requirements.txt create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/agent_test.py create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/langchain/agent.py create mode 100644 docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/langchain/requirements.txt rename docs/en/{user-guide => documentation}/deploy-to/_index.md (100%) rename docs/en/{user-guide => documentation}/deploy-to/cloud-run/_index.md (100%) rename docs/en/{user-guide => documentation}/deploy-to/docker/_index.md (97%) rename docs/en/{user-guide => documentation}/deploy-to/kubernetes/_index.md (100%) rename docs/en/{user-guide => documentation}/getting-started/_index.md (56%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/colab_quickstart.ipynb (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/local_quickstart.md (97%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/local_quickstart_go.md (96%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/local_quickstart_js.md (95%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/mcp_quickstart/_index.md (97%) rename docs/en/{build-with-mcp-toolbox/bigquery => documentation/getting-started}/mcp_quickstart/inspector.png (100%) rename docs/en/{build-with-mcp-toolbox/bigquery => documentation/getting-started}/mcp_quickstart/inspector_tools.png (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/adkgo/go.mod (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/adkgo/go.sum (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/adkgo/quickstart.go (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/genAI/go.mod (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/genAI/go.sum (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/genAI/quickstart.go (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/genkit/go.mod (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/genkit/go.sum (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/genkit/quickstart.go (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/langchain/go.mod (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/langchain/go.sum (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/langchain/quickstart.go (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/openAI/go.mod (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/openAI/go.sum (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/openAI/quickstart.go (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/go/quickstart_test.go (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/adk/package-lock.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/adk/package.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/adk/quickstart.js (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/genAI/package-lock.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/genAI/package.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/genAI/quickstart.js (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/genkit/package-lock.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/genkit/package.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/genkit/quickstart.js (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/langchain/package-lock.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/langchain/package.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/langchain/quickstart.js (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/llamaindex/package-lock.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/llamaindex/package.json (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/llamaindex/quickstart.js (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/js/quickstart.test.js (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/python/__init__.py (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/python/adk/quickstart.py (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/python/adk/requirements.txt (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/python/core/quickstart.py (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/python/core/requirements.txt (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/python/langchain/quickstart.py (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/python/langchain/requirements.txt (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/python/llamaindex/quickstart.py (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/python/llamaindex/requirements.txt (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/python/quickstart_test.py (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/shared/cloud_setup.md (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/shared/configure_toolbox.md (100%) rename docs/en/{build-with-mcp-toolbox => documentation/getting-started}/quickstart/shared/database_setup.md (100%) rename docs/en/{user-guide => documentation}/introduction/_index.md (99%) rename docs/en/{user-guide => documentation}/introduction/architecture.png (100%) rename docs/en/{user-guide => documentation}/monitoring/_index.md (100%) rename docs/en/{user-guide => documentation}/monitoring/export_telemetry.md (100%) rename docs/en/{user-guide => documentation}/monitoring/telemetry/index.md (100%) rename docs/en/{user-guide => documentation}/monitoring/telemetry/telemetry_flow.png (100%) rename docs/en/{user-guide => documentation}/monitoring/telemetry/telemetry_traces.png (100%) create mode 100644 docs/en/integrations/alloydb-admin/source.md create mode 100644 docs/en/integrations/alloydb-admin/tools/_index.md rename docs/en/integrations/alloydb-admin/{ => tools}/alloydb-create-cluster.md (98%) rename docs/en/integrations/alloydb-admin/{ => tools}/alloydb-create-instance.md (98%) rename docs/en/integrations/alloydb-admin/{ => tools}/alloydb-create-user.md (98%) rename docs/en/integrations/alloydb-admin/{ => tools}/alloydb-get-cluster.md (97%) rename docs/en/integrations/alloydb-admin/{ => tools}/alloydb-get-instance.md (97%) rename docs/en/integrations/alloydb-admin/{ => tools}/alloydb-get-user.md (98%) rename docs/en/integrations/alloydb-admin/{ => tools}/alloydb-list-clusters.md (98%) rename docs/en/integrations/alloydb-admin/{ => tools}/alloydb-list-instances.md (98%) rename docs/en/integrations/alloydb-admin/{ => tools}/alloydb-list-users.md (97%) rename docs/en/integrations/alloydb-admin/{ => tools}/alloydb-wait-for-operation.md (98%) create mode 100644 docs/en/integrations/alloydb/samples/_index.md rename docs/en/{build-with-mcp-toolbox/alloydb => integrations/alloydb/samples}/ai-nl/alloydb_ai_nl.ipynb (100%) rename docs/en/{build-with-mcp-toolbox/alloydb => integrations/alloydb/samples}/ai-nl/index.md (77%) rename docs/en/{build-with-mcp-toolbox/alloydb => integrations/alloydb/samples}/mcp_quickstart.md (95%) create mode 100644 docs/en/integrations/alloydb/source.md create mode 100644 docs/en/integrations/alloydb/tools/_index.md rename docs/en/integrations/alloydb/{ => tools}/alloydb-ai-nl.md (97%) create mode 100644 docs/en/integrations/alloydb/tools/postgres-tools.md create mode 100644 docs/en/integrations/bigquery/samples/_index.md rename docs/en/{build-with-mcp-toolbox/bigquery => integrations/bigquery/samples}/colab_quickstart_bigquery.ipynb (100%) rename docs/en/{build-with-mcp-toolbox/bigquery => integrations/bigquery/samples}/local_quickstart.md (99%) rename docs/en/{build-with-mcp-toolbox/bigquery => integrations/bigquery/samples}/mcp_quickstart/_index.md (97%) rename docs/en/{build-with-mcp-toolbox => integrations/bigquery/samples}/mcp_quickstart/inspector.png (100%) rename docs/en/{build-with-mcp-toolbox/looker/looker_mcp_inspector => integrations/bigquery/samples/mcp_quickstart}/inspector_tools.png (100%) create mode 100644 docs/en/integrations/bigquery/source.md create mode 100644 docs/en/integrations/bigquery/tools/_index.md rename docs/en/integrations/bigquery/{ => tools}/bigquery-analyze-contribution.md (98%) rename docs/en/integrations/bigquery/{ => tools}/bigquery-conversational-analytics.md (98%) rename docs/en/integrations/bigquery/{ => tools}/bigquery-execute-sql.md (98%) rename docs/en/integrations/bigquery/{ => tools}/bigquery-forecast.md (99%) rename docs/en/integrations/bigquery/{ => tools}/bigquery-get-dataset-info.md (98%) rename docs/en/integrations/bigquery/{ => tools}/bigquery-get-table-info.md (98%) rename docs/en/integrations/bigquery/{ => tools}/bigquery-list-dataset-ids.md (98%) rename docs/en/integrations/bigquery/{ => tools}/bigquery-list-table-ids.md (98%) rename docs/en/integrations/bigquery/{ => tools}/bigquery-search-catalog.md (98%) rename docs/en/integrations/bigquery/{ => tools}/bigquery-sql.md (99%) create mode 100644 docs/en/integrations/bigtable/source.md create mode 100644 docs/en/integrations/bigtable/tools/_index.md rename docs/en/integrations/bigtable/{ => tools}/bigtable-sql.md (99%) create mode 100644 docs/en/integrations/cassandra/source.md create mode 100644 docs/en/integrations/cassandra/tools/_index.md rename docs/en/integrations/cassandra/{ => tools}/cassandra-cql.md (99%) create mode 100644 docs/en/integrations/clickhouse/source.md create mode 100644 docs/en/integrations/clickhouse/tools/_index.md rename docs/en/integrations/clickhouse/{ => tools}/clickhouse-execute-sql.md (97%) rename docs/en/integrations/clickhouse/{ => tools}/clickhouse-list-databases.md (97%) rename docs/en/integrations/clickhouse/{ => tools}/clickhouse-list-tables.md (98%) rename docs/en/integrations/clickhouse/{ => tools}/clickhouse-sql.md (98%) create mode 100644 docs/en/integrations/cloud-sql-admin/source.md create mode 100644 docs/en/integrations/cloud-sql-admin/tools/_index.md rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlcloneinstance.md (98%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlcreatebackup.md (98%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlcreatedatabase.md (97%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlcreateusers.md (97%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlgetinstances.md (96%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqllistdatabases.md (97%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqllistinstances.md (97%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlmssqlcreateinstance.md (98%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlmysqlcreateinstance.md (98%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlpgcreateinstances.md (98%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlpgupgradeprecheck.md (98%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlrestorebackup.md (98%) rename docs/en/integrations/cloud-sql-admin/{ => tools}/cloudsqlwaitforoperation.md (98%) create mode 100644 docs/en/integrations/cloud-sql-mssql/source.md create mode 100644 docs/en/integrations/cloud-sql-mssql/tools/_index.md create mode 100644 docs/en/integrations/cloud-sql-mssql/tools/mssql-tools.md create mode 100644 docs/en/integrations/cloud-sql-mysql/source.md create mode 100644 docs/en/integrations/cloud-sql-mysql/tools/_index.md create mode 100644 docs/en/integrations/cloud-sql-mysql/tools/mysql-tools.md create mode 100644 docs/en/integrations/cloud-sql-pg/source.md create mode 100644 docs/en/integrations/cloud-sql-pg/tools/_index.md create mode 100644 docs/en/integrations/cloud-sql-pg/tools/postgres-tools.md create mode 100644 docs/en/integrations/cloudgda/source.md create mode 100644 docs/en/integrations/cloudgda/tools/_index.md rename docs/en/integrations/cloudgda/{ => tools}/cloud-gda-query.md (99%) create mode 100644 docs/en/integrations/cloudhealthcare/source.md create mode 100644 docs/en/integrations/cloudhealthcare/tools/_index.md rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-fhir-fetch-page.md (97%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-fhir-patient-everything.md (98%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-fhir-patient-search.md (98%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-get-dataset.md (96%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-get-dicom-store-metrics.md (96%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-get-dicom-store.md (96%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-get-fhir-resource.md (97%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-get-fhir-store-metrics.md (96%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-get-fhir-store.md (96%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-list-dicom-stores.md (95%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-list-fhir-stores.md (96%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-retrieve-rendered-dicom-instance.md (97%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-search-dicom-instances.md (99%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-search-dicom-series.md (99%) rename docs/en/integrations/cloudhealthcare/{ => tools}/cloud-healthcare-search-dicom-studies.md (99%) create mode 100644 docs/en/integrations/cloudloggingadmin/source.md rename docs/en/integrations/cloudloggingadmin/{ => tools}/cloud-logging-admin-list-log-names.md (95%) rename docs/en/integrations/cloudloggingadmin/{ => tools}/cloud-logging-admin-list-resource-types.md (94%) rename docs/en/integrations/cloudloggingadmin/{ => tools}/cloud-logging-admin-query-logs.md (97%) create mode 100644 docs/en/integrations/cloudmonitoring/source.md create mode 100644 docs/en/integrations/cloudmonitoring/tools/_index.md rename docs/en/integrations/cloudmonitoring/{ => tools}/cloud-monitoring-query-prometheus.md (91%) create mode 100644 docs/en/integrations/cockroachdb/source.md create mode 100644 docs/en/integrations/cockroachdb/tools/_index.md rename docs/en/integrations/cockroachdb/{ => tools}/cockroachdb-execute-sql.md (99%) rename docs/en/integrations/cockroachdb/{ => tools}/cockroachdb-list-schemas.md (99%) rename docs/en/integrations/cockroachdb/{ => tools}/cockroachdb-list-tables.md (99%) rename docs/en/integrations/cockroachdb/{ => tools}/cockroachdb-sql.md (99%) create mode 100644 docs/en/integrations/couchbase/source.md create mode 100644 docs/en/integrations/couchbase/tools/_index.md rename docs/en/integrations/couchbase/{ => tools}/couchbase-sql.md (99%) create mode 100644 docs/en/integrations/dataform/tools/_index.md rename docs/en/integrations/dataform/{ => tools}/dataform-compile-local.md (97%) create mode 100644 docs/en/integrations/dataplex/source.md create mode 100644 docs/en/integrations/dataplex/tools/_index.md rename docs/en/integrations/dataplex/{ => tools}/dataplex-lookup-entry.md (98%) rename docs/en/integrations/dataplex/{ => tools}/dataplex-search-aspect-types.md (98%) rename docs/en/integrations/dataplex/{ => tools}/dataplex-search-entries.md (98%) create mode 100644 docs/en/integrations/dgraph/source.md create mode 100644 docs/en/integrations/dgraph/tools/_index.md rename docs/en/integrations/dgraph/{ => tools}/dgraph-dql.md (99%) create mode 100644 docs/en/integrations/elasticsearch/source.md create mode 100644 docs/en/integrations/elasticsearch/tools/_index.md rename docs/en/integrations/elasticsearch/{ => tools}/elasticsearch-esql.md (98%) create mode 100644 docs/en/integrations/firebird/source.md create mode 100644 docs/en/integrations/firebird/tools/_index.md rename docs/en/integrations/firebird/{ => tools}/firebird-execute-sql.md (97%) rename docs/en/integrations/firebird/{ => tools}/firebird-sql.md (99%) create mode 100644 docs/en/integrations/firestore/source.md create mode 100644 docs/en/integrations/firestore/tools/_index.md rename docs/en/integrations/firestore/{ => tools}/firestore-add-documents.md (99%) rename docs/en/integrations/firestore/{ => tools}/firestore-delete-documents.md (96%) rename docs/en/integrations/firestore/{ => tools}/firestore-get-documents.md (97%) rename docs/en/integrations/firestore/{ => tools}/firestore-get-rules.md (97%) rename docs/en/integrations/firestore/{ => tools}/firestore-list-collections.md (97%) rename docs/en/integrations/firestore/{ => tools}/firestore-query-collection.md (99%) rename docs/en/integrations/firestore/{ => tools}/firestore-query.md (99%) rename docs/en/integrations/firestore/{ => tools}/firestore-update-document.md (99%) rename docs/en/integrations/firestore/{ => tools}/firestore-validate-rules.md (98%) create mode 100644 docs/en/integrations/http/source.md create mode 100644 docs/en/integrations/http/tools/_index.md rename docs/en/integrations/http/{ => tools}/http-tool.md (99%) create mode 100644 docs/en/integrations/looker/samples/_index.md rename docs/en/{build-with-mcp-toolbox/looker => integrations/looker/samples}/looker_gemini.md (95%) rename docs/en/{build-with-mcp-toolbox/looker => integrations/looker/samples}/looker_gemini_oauth/_index.md (98%) rename docs/en/{build-with-mcp-toolbox/looker => integrations/looker/samples}/looker_gemini_oauth/authenticated.png (100%) rename docs/en/{build-with-mcp-toolbox/looker => integrations/looker/samples}/looker_gemini_oauth/authorize.png (100%) rename docs/en/{build-with-mcp-toolbox/looker => integrations/looker/samples}/looker_gemini_oauth/registration.png (100%) rename docs/en/{build-with-mcp-toolbox/looker => integrations/looker/samples}/looker_mcp_inspector/_index.md (94%) rename docs/en/{build-with-mcp-toolbox/looker => integrations/looker/samples}/looker_mcp_inspector/inspector.png (100%) rename docs/en/{build-with-mcp-toolbox/mcp_quickstart => integrations/looker/samples/looker_mcp_inspector}/inspector_tools.png (100%) create mode 100644 docs/en/integrations/looker/source.md create mode 100644 docs/en/integrations/looker/tools/_index.md rename docs/en/integrations/looker/{ => tools}/looker-add-dashboard-element.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-add-dashboard-filter.md (99%) rename docs/en/integrations/looker/{ => tools}/looker-conversational-analytics.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-create-project-directory.md (96%) rename docs/en/integrations/looker/{ => tools}/looker-create-project-file.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-delete-project-directory.md (96%) rename docs/en/integrations/looker/{ => tools}/looker-delete-project-file.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-dev-mode.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-generate-embed-url.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-get-connection-databases.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-get-connection-schemas.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-get-connection-table-columns.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-get-connection-tables.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-get-connections.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-get-dashboards.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-get-dimensions.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-get-explores.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-get-filters.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-get-looks.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-get-measures.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-get-models.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-get-parameters.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-get-project-directories.md (96%) rename docs/en/integrations/looker/{ => tools}/looker-get-project-file.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-get-project-files.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-get-projects.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-health-analyze.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-health-pulse.md (99%) rename docs/en/integrations/looker/{ => tools}/looker-health-vacuum.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-make-dashboard.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-make-look.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-query-sql.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-query-url.md (99%) rename docs/en/integrations/looker/{ => tools}/looker-query.md (98%) rename docs/en/integrations/looker/{ => tools}/looker-run-dashboard.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-run-look.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-update-project-file.md (97%) rename docs/en/integrations/looker/{ => tools}/looker-validate-project.md (97%) create mode 100644 docs/en/integrations/mariadb/source.md create mode 100644 docs/en/integrations/mariadb/tools/_index.md create mode 100644 docs/en/integrations/mariadb/tools/mysql-tools.md create mode 100644 docs/en/integrations/mindsdb/source.md create mode 100644 docs/en/integrations/mindsdb/tools/_index.md rename docs/en/integrations/mindsdb/{ => tools}/mindsdb-execute-sql.md (99%) rename docs/en/integrations/mindsdb/{ => tools}/mindsdb-sql.md (99%) create mode 100644 docs/en/integrations/mongodb/source.md create mode 100644 docs/en/integrations/mongodb/tools/_index.md rename docs/en/integrations/mongodb/{ => tools}/mongodb-aggregate.md (99%) rename docs/en/integrations/mongodb/{ => tools}/mongodb-delete-many.md (98%) rename docs/en/integrations/mongodb/{ => tools}/mongodb-delete-one.md (98%) rename docs/en/integrations/mongodb/{ => tools}/mongodb-find-one.md (99%) rename docs/en/integrations/mongodb/{ => tools}/mongodb-find.md (99%) rename docs/en/integrations/mongodb/{ => tools}/mongodb-insert-many.md (98%) rename docs/en/integrations/mongodb/{ => tools}/mongodb-insert-one.md (98%) rename docs/en/integrations/mongodb/{ => tools}/mongodb-update-many.md (99%) rename docs/en/integrations/mongodb/{ => tools}/mongodb-update-one.md (99%) create mode 100644 docs/en/integrations/mssql/source.md create mode 100644 docs/en/integrations/mssql/tools/_index.md rename docs/en/integrations/mssql/{ => tools}/mssql-execute-sql.md (97%) rename docs/en/integrations/mssql/{ => tools}/mssql-list-tables.md (98%) rename docs/en/integrations/mssql/{ => tools}/mssql-sql.md (99%) create mode 100644 docs/en/integrations/mysql/source.md create mode 100644 docs/en/integrations/mysql/tools/_index.md rename docs/en/integrations/mysql/{ => tools}/mysql-execute-sql.md (98%) rename docs/en/integrations/mysql/{ => tools}/mysql-get-query-plan.md (97%) rename docs/en/integrations/mysql/{ => tools}/mysql-list-active-queries.md (98%) rename docs/en/integrations/mysql/{ => tools}/mysql-list-table-fragmentation.md (98%) rename docs/en/integrations/mysql/{ => tools}/mysql-list-tables-missing-unique-indexes.md (97%) rename docs/en/integrations/mysql/{ => tools}/mysql-list-tables.md (98%) rename docs/en/integrations/mysql/{ => tools}/mysql-sql.md (99%) create mode 100644 docs/en/integrations/neo4j/samples/_index.md rename docs/en/{build-with-mcp-toolbox/neo4j => integrations/neo4j/samples}/mcp_quickstart.md (97%) create mode 100644 docs/en/integrations/neo4j/source.md create mode 100644 docs/en/integrations/neo4j/tools/_index.md rename docs/en/integrations/neo4j/{ => tools}/neo4j-cypher.md (99%) rename docs/en/integrations/neo4j/{ => tools}/neo4j-execute-cypher.md (98%) rename docs/en/integrations/neo4j/{ => tools}/neo4j-schema.md (98%) create mode 100644 docs/en/integrations/oceanbase/source.md create mode 100644 docs/en/integrations/oceanbase/tools/_index.md rename docs/en/integrations/oceanbase/{ => tools}/oceanbase-execute-sql.md (97%) rename docs/en/integrations/oceanbase/{ => tools}/oceanbase-sql.md (99%) create mode 100644 docs/en/integrations/oracle/source.md create mode 100644 docs/en/integrations/oracle/tools/_index.md rename docs/en/integrations/oracle/{ => tools}/oracle-execute-sql.md (95%) rename docs/en/integrations/oracle/{ => tools}/oracle-sql.md (98%) create mode 100644 docs/en/integrations/postgres/source.md create mode 100644 docs/en/integrations/postgres/tools/_index.md rename docs/en/integrations/postgres/{ => tools}/postgres-database-overview.md (97%) rename docs/en/integrations/postgres/{ => tools}/postgres-execute-sql.md (97%) rename docs/en/integrations/postgres/{ => tools}/postgres-get-column-cardinality.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-active-queries.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-available-extensions.md (97%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-database-stats.md (99%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-indexes.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-installed-extensions.md (96%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-locks.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-pg-settings.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-publication-tables.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-query-stats.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-roles.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-schemas.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-sequences.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-stored-procedure.md (99%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-table-stats.md (99%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-tables.md (97%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-tablespaces.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-triggers.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-list-views.md (97%) rename docs/en/integrations/postgres/{ => tools}/postgres-long-running-transactions.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-replication-stats.md (98%) rename docs/en/integrations/postgres/{ => tools}/postgres-sql.md (99%) create mode 100644 docs/en/integrations/redis/source.md create mode 100644 docs/en/integrations/redis/tools/_index.md rename docs/en/integrations/redis/{ => tools}/redis-tool.md (98%) create mode 100644 docs/en/integrations/serverless-spark/source.md create mode 100644 docs/en/integrations/serverless-spark/tools/_index.md rename docs/en/integrations/serverless-spark/{ => tools}/serverless-spark-cancel-batch.md (97%) rename docs/en/integrations/serverless-spark/{ => tools}/serverless-spark-create-pyspark-batch.md (98%) rename docs/en/integrations/serverless-spark/{ => tools}/serverless-spark-create-spark-batch.md (98%) rename docs/en/integrations/serverless-spark/{ => tools}/serverless-spark-get-batch.md (98%) rename docs/en/integrations/serverless-spark/{ => tools}/serverless-spark-get-session-template.md (100%) rename docs/en/integrations/serverless-spark/{ => tools}/serverless-spark-list-batches.md (98%) create mode 100644 docs/en/integrations/singlestore/source.md create mode 100644 docs/en/integrations/singlestore/tools/_index.md rename docs/en/integrations/singlestore/{ => tools}/singlestore-execute-sql.md (96%) rename docs/en/integrations/singlestore/{ => tools}/singlestore-sql.md (99%) create mode 100644 docs/en/integrations/snowflake/samples/_index.md rename docs/en/{build-with-mcp-toolbox/snowflake => integrations/snowflake/samples}/runme.py (100%) rename docs/en/{build-with-mcp-toolbox/snowflake/_index.md => integrations/snowflake/samples/sample.md} (89%) rename docs/en/{build-with-mcp-toolbox/snowflake => integrations/snowflake/samples}/snowflake-config.yaml (100%) rename docs/en/{build-with-mcp-toolbox/snowflake => integrations/snowflake/samples}/snowflake-env.sh (91%) rename docs/en/{build-with-mcp-toolbox/snowflake => integrations/snowflake/samples}/test-snowflake.sh (82%) create mode 100644 docs/en/integrations/snowflake/source.md create mode 100644 docs/en/integrations/snowflake/tools/_index.md rename docs/en/integrations/snowflake/{ => tools}/snowflake-execute-sql.md (97%) rename docs/en/integrations/snowflake/{ => tools}/snowflake-sql.md (99%) create mode 100644 docs/en/integrations/spanner/source.md create mode 100644 docs/en/integrations/spanner/tools/_index.md rename docs/en/integrations/spanner/{ => tools}/spanner-execute-sql.md (97%) rename docs/en/integrations/spanner/{ => tools}/spanner-list-graphs.md (99%) rename docs/en/integrations/spanner/{ => tools}/spanner-list-tables.md (99%) rename docs/en/integrations/spanner/{ => tools}/spanner-sql.md (99%) create mode 100644 docs/en/integrations/sqlite/source.md create mode 100644 docs/en/integrations/sqlite/tools/_index.md rename docs/en/integrations/sqlite/{ => tools}/sqlite-execute-sql.md (97%) rename docs/en/integrations/sqlite/{ => tools}/sqlite-sql.md (99%) create mode 100644 docs/en/integrations/tidb/source.md create mode 100644 docs/en/integrations/tidb/tools/_index.md rename docs/en/integrations/tidb/{ => tools}/tidb-execute-sql.md (97%) rename docs/en/integrations/tidb/{ => tools}/tidb-sql.md (99%) create mode 100644 docs/en/integrations/trino/source.md create mode 100644 docs/en/integrations/trino/tools/_index.md rename docs/en/integrations/trino/{ => tools}/trino-execute-sql.md (97%) rename docs/en/integrations/trino/{ => tools}/trino-sql.md (99%) create mode 100644 docs/en/integrations/utility/tools/_index.md rename docs/en/integrations/utility/{ => tools}/wait.md (98%) create mode 100644 docs/en/integrations/valkey/source.md create mode 100644 docs/en/integrations/valkey/tools/_index.md rename docs/en/integrations/valkey/{ => tools}/valkey-tool.md (98%) create mode 100644 docs/en/integrations/yuagbytedb/source.md create mode 100644 docs/en/integrations/yuagbytedb/tools/_index.md rename docs/en/integrations/yuagbytedb/{ => tools}/yugabytedb-sql.md (99%) rename docs/en/{build-with-mcp-toolbox => samples-hub}/_index.md (85%) rename docs/en/{build-with-mcp-toolbox => samples-hub}/deploy_adk_agent.md (91%) rename docs/en/{build-with-mcp-toolbox => samples-hub}/prompts_quickstart_gemini_cli.md (99%) delete mode 100644 docs/en/user-guide/_index.md delete mode 100644 docs/en/user-guide/connect-to/ides/alloydb_pg_admin_mcp.md delete mode 100644 docs/en/user-guide/connect-to/ides/alloydb_pg_mcp.md delete mode 100644 docs/en/user-guide/connect-to/ides/bigquery_mcp.md delete mode 100644 docs/en/user-guide/connect-to/ides/cloud_sql_mssql_mcp.md delete mode 100644 docs/en/user-guide/connect-to/ides/cloud_sql_mysql_mcp.md delete mode 100644 docs/en/user-guide/connect-to/ides/cloud_sql_pg_mcp.md delete mode 100644 docs/en/user-guide/connect-to/ides/firestore_mcp.md delete mode 100644 docs/en/user-guide/connect-to/ides/spanner_mcp.md diff --git a/.ci/lint-docs-source-page.sh b/.ci/lint-docs-source-page.sh index 9311581cd51e..f72dd089e0f7 100755 --- a/.ci/lint-docs-source-page.sh +++ b/.ci/lint-docs-source-page.sh @@ -43,7 +43,11 @@ ALLOWED_ORDER = [ "Troubleshooting", "Additional Resources" ] -REQUIRED = {"About", "Example", "Reference"} + +# "Available Tools" is explicitly required +REQUIRED = {"About", "Available Tools", "Example", "Reference"} + +# Regex to catch any variation of the list-tools shortcode SHORTCODE_PATTERN = r"\{\{<\s*list-tools.*?>\}\}" # --------------------- @@ -53,10 +57,12 @@ if not integration_dir.exists(): sys.exit(0) has_errors = False +source_pages_found = 0 -for filepath in integration_dir.rglob("_index.md"): - if filepath.parent == integration_dir: - continue +# ONLY scan files specifically named "source.md" +for filepath in integration_dir.rglob("source.md"): + source_pages_found += 1 + file_errors = False with open(filepath, "r", encoding="utf-8") as f: content = f.read() @@ -65,30 +71,33 @@ for filepath in integration_dir.rglob("_index.md"): if match: frontmatter, body = match.group(1), match.group(2) else: - frontmatter, body = "", content - - if not body.strip(): + print(f"[{filepath}] Error: Missing or invalid YAML frontmatter.") + has_errors = True continue - file_errors = False + # 1. Check for linkTitle: "Source" in frontmatter + link_title_match = re.search(r"^linkTitle:\s*[\"']?(.*?)[\"']?\s*$", frontmatter, re.MULTILINE) + if not link_title_match or link_title_match.group(1).strip() != "Source": + print(f"[{filepath}] Error: Frontmatter must contain exactly linkTitle: \"Source\".") + file_errors = True - # 1. Frontmatter Title Check - title_match = re.search(r"^title:\s*[\"']?(.*?)[\"']?\s*$", frontmatter if frontmatter else content, re.MULTILINE) - if not title_match or not title_match.group(1).strip().endswith("Source"): - print(f"[{filepath}] Error: Title must end with 'Source'.") + # 2. Check for weight: 1 in frontmatter + weight_match = re.search(r"^weight:\s*[\"']?(\d+)[\"']?\s*$", frontmatter, re.MULTILINE) + if not weight_match or weight_match.group(1).strip() != "1": + print(f"[{filepath}] Error: Frontmatter must contain exactly weight: 1.") file_errors = True - # 2. Shortcode Placement Check - tools_section = re.search(r"^##\s+Available Tools\s*(.*?)(?=^##\s|\Z)", body, re.MULTILINE | re.DOTALL) - if tools_section: - if not re.search(SHORTCODE_PATTERN, tools_section.group(1)): - print(f"[{filepath}] Error: {{< list-tools >}} must be under '## Available Tools'.") + # 3. Check Shortcode Placement & Available Tools Section + tools_section_match = re.search(r"^##\s+Available Tools\s*(.*?)(?=^##\s|\Z)", body, re.MULTILINE | re.DOTALL) + if tools_section_match: + if not re.search(SHORTCODE_PATTERN, tools_section_match.group(1)): + print(f"[{filepath}] Error: The list-tools shortcode must be placed under the '## Available Tools' heading.") file_errors = True - elif re.search(SHORTCODE_PATTERN, body): - print(f"[{filepath}] Error: {{< list-tools >}} found, but '## Available Tools' heading is missing.") + else: + print(f"[{filepath}] Error: The '## Available Tools' heading is missing or incorrectly formatted.") file_errors = True - # 3. Heading Linting (Stripping code blocks first) + # Strip code blocks from body to avoid linting example markdown headings clean_body = re.sub(r"```.*?```", "", body, flags=re.DOTALL) if re.search(r"^#\s+\w+", clean_body, re.MULTILINE): @@ -97,9 +106,10 @@ for filepath in integration_dir.rglob("_index.md"): h2s = [h.strip() for h in re.findall(r"^##\s+(.*)", clean_body, re.MULTILINE)] - # 4. Required & Unauthorized Check - if missing := (REQUIRED - set(h2s)): - print(f"[{filepath}] Error: Missing required H2s: {missing}") + # Missing Required Headings + missing = REQUIRED - set(h2s) + if missing: + print(f"[{filepath}] Error: Missing required H2 headings: {missing}") file_errors = True if unauthorized := (set(h2s) - set(ALLOWED_ORDER)): @@ -113,9 +123,13 @@ for filepath in integration_dir.rglob("_index.md"): if file_errors: has_errors = True -if has_errors: - print("Linting failed. Fix structure errors above.") +# Handle final output based on what was found +if source_pages_found == 0: + print("Info: No 'source.md' files found in integrations. Passing gracefully.") + sys.exit(0) +elif has_errors: + print(f"\nLinting failed. Please fix the structure errors in the {source_pages_found} 'source.md' file(s) above.") sys.exit(1) -print("Success: Source pages validated.") -sys.exit(0) +else: + print(f"Success: {source_pages_found} 'source.md' file(s) passed structure validation.") EOF diff --git a/.ci/lint-docs-tool-page.sh b/.ci/lint-docs-tool-page.sh index 9b3cde4089f8..326b32f50530 100755 --- a/.ci/lint-docs-tool-page.sh +++ b/.ci/lint-docs-tool-page.sh @@ -53,12 +53,12 @@ if not integration_dir.exists(): sys.exit(0) has_errors = False +tools_pages_found = 0 -# Find all .md files, excluding _index.md (which are Source pages) -for filepath in integration_dir.rglob("*.md"): - if filepath.name == "_index.md": - continue - +# Specifically target the tools directories +for filepath in integration_dir.rglob("tools/*.md"): + tools_pages_found += 1 + with open(filepath, "r", encoding="utf-8") as f: content = f.read() @@ -68,23 +68,34 @@ for filepath in integration_dir.rglob("*.md"): frontmatter = match.group(1) body = match.group(2) else: - frontmatter = "" - body = content - - if not body.strip(): + print(f"[{filepath}] Error: Missing or invalid YAML frontmatter.") + has_errors = True continue file_errors = False - # 1. Check Frontmatter Title - title_source = frontmatter if frontmatter else content - title_match = re.search(r"^title:\s*[\"']?(.*?)[\"']?\s*$", title_source, re.MULTILINE) - if not title_match or not title_match.group(1).strip().endswith("Tool"): - found_title = title_match.group(1) if title_match else "None" - print(f"[{filepath}] Error: Frontmatter title must end with 'Tool'. Found: '{found_title}'") - file_errors = True + # --- SPECIAL VALIDATION FOR tools/_index.md --- + if filepath.name == "_index.md": + title_match = re.search(r"^title:\s*[\"']?(.*?)[\"']?\s*$", frontmatter, re.MULTILINE) + if not title_match or title_match.group(1).strip() != "Tools": + print(f"[{filepath}] Error: tools/_index.md must have exactly title: \"Tools\"") + file_errors = True + + weight_match = re.search(r"^weight:\s*(\d+)\s*$", frontmatter, re.MULTILINE) + if not weight_match or weight_match.group(1).strip() != "2": + print(f"[{filepath}] Error: tools/_index.md must have exactly weight: 2") + file_errors = True + + if file_errors: + has_errors = True + continue # Skip the rest of the body linting for this structural file - # 2. Check Shortcode Placement + # --- VALIDATION FOR REGULAR TOOL PAGES --- + # If the file has no markdown content (metadata placeholder only), skip it entirely + if not body.strip(): + continue + + # 1. Check Shortcode Placement sources_section_match = re.search(r"^##\s+Compatible Sources\s*(.*?)(?=^##\s|\Z)", body, re.MULTILINE | re.DOTALL) if sources_section_match: if not re.search(SHORTCODE_PATTERN, sources_section_match.group(1)): @@ -94,16 +105,17 @@ for filepath in integration_dir.rglob("*.md"): print(f"[{filepath}] Error: Shortcode found, but '## Compatible Sources' heading is missing.") file_errors = True - # 3. Strip code blocks - clean_body = re.sub(r"^(?:```|~~~).*?^(?:```|~~~)", "", body, flags=re.DOTALL | re.MULTILINE) + # 2. Strip code blocks from body to avoid linting example markdown headings + clean_body = re.sub(r"```.*?```", "", body, flags=re.DOTALL) - # 4. Check H1 Headings + # 3. Check H1 Headings if re.search(r"^#\s+\w+", clean_body, re.MULTILINE): print(f"[{filepath}] Error: H1 headings (#) are forbidden in the body.") file_errors = True - # 5. Check H2 Headings - h2s = [h.strip() for h in re.findall(r"^##\s+(.*)", clean_body, re.MULTILINE)] + # 4. Check H2 Headings + h2s = re.findall(r"^##\s+(.*)", clean_body, re.MULTILINE) + h2s = [h2.strip() for h2 in h2s] # Missing Required if missing := (REQUIRED - set(h2s)): @@ -127,9 +139,12 @@ for filepath in integration_dir.rglob("*.md"): if file_errors: has_errors = True -if has_errors: +if tools_pages_found == 0: + print("Info: No tool directories found. Passing gracefully.") + sys.exit(0) +elif has_errors: print("Linting failed for Tool pages. Please fix the structure errors above.") sys.exit(1) else: - print("Success: All Tool pages passed structure validation.") + print(f"Success: All {tools_pages_found} Tool page(s) passed structure validation.") EOF diff --git a/.github/release-please.yml b/.github/release-please.yml index 343118c336d9..ac2d9d5ae39b 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -19,7 +19,7 @@ versionFile: "cmd/version.txt" extraFiles: [ "README.md", "docs/en/build-with-mcp-toolbox/colab_quickstart.ipynb", - "docs/en/user-guide/introduction/_index.md", + "docs/en/documentation/introduction/_index.md", "docs/en/build-with-mcp-toolbox/mcp_quickstart/_index.md", "docs/en/build-with-mcp-toolbox/quickstart/shared/configure_toolbox.md", "docs/en/build-with-mcp-toolbox/alloydb/_index.md", @@ -31,12 +31,12 @@ extraFiles: [ "docs/en/build-with-mcp-toolbox/looker/looker_gemini.md", "docs/en/build-with-mcp-toolbox/looker/looker_gemini_oauth/_index.md", "docs/en/build-with-mcp-toolbox/looker/looker_mcp_inspector/_index.md", - "docs/en/user-guide/connect-to/ides/looker_mcp.md", - "docs/en/user-guide/connect-to/ides/mysql_mcp.md", - "docs/en/user-guide/connect-to/ides/mssql_mcp.md", - "docs/en/user-guide/connect-to/ides/postgres_mcp.md", - "docs/en/user-guide/connect-to/ides/neo4j_mcp.md", - "docs/en/user-guide/connect-to/ides/sqlite_mcp.md", + "docs/en/documentation/connect-to/ides/looker_mcp.md", + "docs/en/documentation/connect-to/ides/mysql_mcp.md", + "docs/en/documentation/connect-to/ides/mssql_mcp.md", + "docs/en/documentation/connect-to/ides/postgres_mcp.md", + "docs/en/documentation/connect-to/ides/neo4j_mcp.md", + "docs/en/documentation/connect-to/ides/sqlite_mcp.md", "gemini-extension.json", { "type": "json", diff --git a/.hugo/assets/scss/_styles_project.scss b/.hugo/assets/scss/_styles_project.scss index 7a29298b0322..1ae77e4c7eda 100644 --- a/.hugo/assets/scss/_styles_project.scss +++ b/.hugo/assets/scss/_styles_project.scss @@ -7,4 +7,4 @@ @import 'components/layout'; @import 'components/header'; @import 'components/sidebar'; -@import 'components/callouts'; \ No newline at end of file +@import 'components/callouts'; diff --git a/.hugo/assets/scss/components/_header.scss b/.hugo/assets/scss/components/_header.scss index 81095788e343..bfdcebceffed 100644 --- a/.hugo/assets/scss/components/_header.scss +++ b/.hugo/assets/scss/components/_header.scss @@ -39,7 +39,7 @@ header, .td-navbar { max-width: 500px !important; margin: 0 !important; z-index: 1060 !important; - transition: all 0.15s ease-out !important; + transition: opacity 0.15s ease-out, transform 0.15s ease-out, box-shadow 0.15s ease-out !important; } .td-navbar .pagefind-ui__drawer { left: 0 !important; right: 0 !important; width: 100% !important; max-width: 100% !important; diff --git a/.hugo/assets/scss/components/_sidebar.scss b/.hugo/assets/scss/components/_sidebar.scss index 9131ba272025..2773a1c97588 100644 --- a/.hugo/assets/scss/components/_sidebar.scss +++ b/.hugo/assets/scss/components/_sidebar.scss @@ -141,4 +141,49 @@ body.dark .td-page-meta a { html[data-bs-theme="dark"] .td-page-meta, body.dark .td-page-meta { border-bottom-color: rgba(255,255,255,0.1); +} + +/* ================================================================= */ +/* INTEGRATIONS SIDEBAR LOCKS (DB Root, Tools, & Samples) */ +/* ================================================================= */ + +/* LOCK ALL sections in Integrations +a.td-sidebar-link__section[href*="/integrations/"] { + pointer-events: none !important; + cursor: default !important; +} + +/* UNLOCK the top-level "/integrations/" root folder itself so it can be toggled */ +a.td-sidebar-link__section[href$="/integrations/"] { + pointer-events: auto !important; + cursor: pointer !important; +} + +/* UNLOCK everything nested inside samples or tools (e.g., /samples/my-quickstart/) */ +a.td-sidebar-link__section[href*="/samples/"], +a.td-sidebar-link__section[href*="/tools/"] { + pointer-events: auto !important; + cursor: pointer !important; +} + +/* RE-LOCK exactly the structural "tools" and "samples" parent folders */ +a.td-sidebar-link__section[href$="/tools/"], +a.td-sidebar-link__section[href$="/samples/"] { + pointer-events: none !important; + cursor: default !important; +} + +/* ================================================================= */ +/* REMOVE TAGS FROM RIGHT SIDEBAR & PAGE META */ +/* ================================================================= */ + +.td-toc .taxonomy, +.td-toc .td-tags, +.td-toc [class*="taxonomy"], +.td-page-meta .taxonomy, +.td-page-meta .td-tags, +.td-page-meta [class*="taxonomy"], +.td-page-meta h5.taxonomy-tree-header, +.td-page-meta ul.taxonomy-terms { + display: none !important; } \ No newline at end of file diff --git a/.hugo/layouts/docs/redirect.html b/.hugo/layouts/docs/redirect.html new file mode 100644 index 000000000000..99a494037808 --- /dev/null +++ b/.hugo/layouts/docs/redirect.html @@ -0,0 +1,11 @@ + + + + {{ .Title }} + + + + +

Redirecting you to {{ .Params.external_url }}...

+ + \ No newline at end of file diff --git a/.hugo/layouts/partials/hooks/body-end.html b/.hugo/layouts/partials/hooks/body-end.html index 5c11bba4f45a..d4d412ea7588 100644 --- a/.hugo/layouts/partials/hooks/body-end.html +++ b/.hugo/layouts/partials/hooks/body-end.html @@ -52,7 +52,29 @@ logoLink.href = "{{ site.Params.global_logo_url | default `/` }}"; } - // Build Navigation HTML + const sidebar = document.querySelector('#td-section-nav') || document.querySelector('.td-sidebar-nav') || document.querySelector('.td-sidebar'); + + if (sidebar) { + // 2. Find the currently active link + const activeLink = sidebar.querySelector('.active'); + + if (activeLink) { + // 3. Get exact pixel coordinates on the screen + const sidebarRect = sidebar.getBoundingClientRect(); + const activeRect = activeLink.getBoundingClientRect(); + + // 4. Calculate exactly where the link is relative to the sidebar's current scroll + const linkTop = activeRect.top - sidebarRect.top + sidebar.scrollTop; + + // 5. Center it mathematically + const centerPos = linkTop - (sidebar.clientHeight / 2) + (activeRect.height / 2); + + // 6. Apply strictly to the sidebar container + sidebar.scrollTop = centerPos; + } + } + + // 3. Build Navigation HTML (With 404 Safety Net & Double-Prefix Protection) let leftNavItems = ''; let rightNavItems = ''; diff --git a/.hugo/layouts/partials/search-input.html b/.hugo/layouts/partials/search-input.html index 97c89aa62cb3..407adb6b3980 100644 --- a/.hugo/layouts/partials/search-input.html +++ b/.hugo/layouts/partials/search-input.html @@ -20,7 +20,6 @@ window.addEventListener('DOMContentLoaded', (event) => { - // 1. Initialize Pagefind Search instances document.querySelectorAll('.pagefind-search-container').forEach(el => { new PagefindUI({ element: el, @@ -45,10 +44,9 @@ }); }); - // 2. Setup Global Search Modal Behavior setTimeout(() => { let backdrop = document.getElementById('global-search-backdrop'); - + if (!backdrop) { backdrop = document.createElement('div'); backdrop.id = 'global-search-backdrop'; @@ -84,19 +82,17 @@ function closeModal(keepFocus = false) { if (!activeWrapper) return; isClosing = true; - + backdrop.classList.remove('active'); document.body.classList.remove('global-search-active'); activeWrapper.classList.remove('active-modal'); - - // Return to original location + if (placeholder.parentNode) { placeholder.parentNode.insertBefore(activeWrapper, placeholder); } - + const input = activeWrapper.querySelector('.pagefind-ui__search-input'); - - // Handle focus state upon closure + if (!keepFocus) { const clearBtn = activeWrapper.querySelector('.pagefind-ui__search-clear'); if (clearBtn) clearBtn.click(); @@ -108,10 +104,9 @@ } activeWrapper = null; - setTimeout(() => { isClosing = false; }, 50); // Reset lock + setTimeout(() => { isClosing = false; }, 50); } - // Bind Event Listeners document.addEventListener('input', (e) => { if (e.target.classList.contains('pagefind-ui__search-input')) { if (e.target.value.trim() !== '') { @@ -131,7 +126,9 @@ const clickedResult = e.target.closest('.pagefind-ui__result-link'); const isClickInside = activeWrapper.contains(e.target); - if (clickedX || clickedResult || (!isClickInside && e.target !== backdrop)) { + if (clickedResult) return; + + if (clickedX || (!isClickInside && e.target !== backdrop)) { closeModal(false); } }); @@ -180,7 +177,7 @@ body.td-dark #global-search-backdrop { background-color: rgba(0, 0, 0, 0.8); } - + .custom-pagefind-wrapper.active-modal { position: fixed !important; top: 12vh !important; @@ -296,7 +293,7 @@ .pagefind-ui__hidden { display: none !important; } /* ======================================================= - DESKTOP SEARCH BAR (Top Navbar) + 1. DESKTOP SEARCH BAR (Top Navbar) ======================================================= */ @media (min-width: 992px) { .td-navbar .custom-pagefind-wrapper:not(.active-modal) { @@ -318,16 +315,14 @@ } /* ======================================================= - MOBILE (< 992px): Native Docsy Stacked Layout + 2. MOBILE (< 992px): Native Docsy Stacked Layout ======================================================= */ @media (max-width: 991.98px) { - /* Hide the main navbar search completely */ .td-navbar .custom-pagefind-wrapper, .td-navbar .container-fluid > div.d-none.d-lg-block { display: none !important; } - /* Unhide and show the sidebar search natively */ .td-sidebar .td-search, .td-sidebar .custom-pagefind-wrapper:not(.active-modal) { display: block !important; @@ -339,7 +334,7 @@ } /* ======================================================= - LEFT SIDEBAR TOGGLE ALIGNMENT + 3. LEFT SIDEBAR TOGGLE ALIGNMENT ======================================================= */ @media (max-width: 767.98px) { .td-sidebar__search { @@ -393,7 +388,7 @@ } /* ======================================================= - DARK MODE STYLING + 4. DARK MODE STYLING ======================================================= */ html[data-bs-theme="dark"] .pagefind-ui__search-input, body.td-dark .pagefind-ui__search-input { background-color: rgba(0, 0, 0, 0.2) !important; diff --git a/.hugo/layouts/shortcodes/compatible-sources.html b/.hugo/layouts/shortcodes/compatible-sources.html index af410fd0b016..be229aa6dcf0 100644 --- a/.hugo/layouts/shortcodes/compatible-sources.html +++ b/.hugo/layouts/shortcodes/compatible-sources.html @@ -1,5 +1,5 @@ -{{/* Automatically identify the "Native" source (the parent _index.md) */}} -{{ $nativeSource := .Page.Parent }} +{{/* Automatically identify the "Native" source (Grandparent _index.md, since this is strictly used inside tools/) */}} +{{ $nativeSource := .Page.Parent.Parent }}

This tool can be used with the following database sources:

diff --git a/.hugo/layouts/shortcodes/list-db.html b/.hugo/layouts/shortcodes/list-db.html new file mode 100644 index 000000000000..60e4616c8ebf --- /dev/null +++ b/.hugo/layouts/shortcodes/list-db.html @@ -0,0 +1,98 @@ +
+ {{/* Loop through all sub-folders, sorted alphabetically */}} + {{ range .Page.Pages.ByTitle }} + {{ $displayTitle := .Title }} + {{ $targetLink := .RelPermalink }} + {{ $displayDesc := .Description }} + {{ with .GetPage "source.md" }} + {{ $targetLink = .RelPermalink }} + {{ $displayDesc = .Description }} + {{ end }} + + +
+
+ {{ $displayTitle }} + + + + +
+
{{ $displayDesc | default "Explore this integration." | plainify | truncate 120 }}
+
+
+ {{ end }} +
+ + \ No newline at end of file diff --git a/.hugo/layouts/shortcodes/list-tools.html b/.hugo/layouts/shortcodes/list-tools.html index 4639635443a5..7610aa6559ba 100644 --- a/.hugo/layouts/shortcodes/list-tools.html +++ b/.hugo/layouts/shortcodes/list-tools.html @@ -1,42 +1,99 @@ -{{/* Capture the current page's title (e.g., "AlloyDB") */}} -{{ $currentTitle := .Page.Title }} -{{ $currentPages := .Page.RegularPages }} +{{/* Dynamically determine the Local Database Title and Page Type */}} +{{ $dbTitle := .Page.Title }} +{{ $isToolPage := false }} -{{/* Display Current Directory Tools (if any exist) */}} -{{ if $currentPages }} -

{{ $currentTitle }} Tools

- - - - - - - - - {{ range $currentPages }} - - - - +{{ if .Page.Parent }} + {{ if eq .Page.Parent.Title "Tools" }} + {{ $dbTitle = .Page.Parent.Parent.Title }} + {{ $isToolPage = true }} + {{ else }} + {{ $dbTitle = .Page.Parent.Title }} + {{ end }} +{{ end }} + +{{/* 1. Gather & Pre-filter Native Tools */}} +{{ $validNativeTools := slice }} +{{ if not $isToolPage }} + {{ $localTools := .Page.CurrentSection.GetPage "tools" }} + {{ if $localTools }} + {{ range $localTools.RegularPages }} + {{ if not .Params.is_wrapper }} + {{ $validNativeTools = $validNativeTools | append . }} + {{ end }} {{ end }} - -
Tool NameDescription
{{ .Title }}{{ .Description | default "No description provided." }}
+ {{ end }} +{{ end }} + +{{/* Track if we've printed the main H3 header yet */}} +{{ $headerPrinted := false }} + +{{/* 2. Display Native Tools ONLY if valid ones exist */}} +{{ if gt (len $validNativeTools) 0 }} +

{{ $dbTitle }} Tools

+ {{ $headerPrinted = true }} + + + + + + + + + {{ range $validNativeTools }} + + + + + {{ end }} + +
Tool NameDescription
{{ .Title }}{{ .Description | default "No description provided." }}
{{ end }} -{{/* Display Inherited Tools from specified directories */}} +{{/* 3. Gather & Display Inherited Tools */}} {{ $dirsParam := .Get "dirs" }} {{ if $dirsParam }} {{ range split $dirsParam "," }} {{ $dirPath := trim . " " }} - {{ $toolDir := site.GetPage $dirPath }} + {{ $targetDir := site.GetPage $dirPath }} + + {{ if $targetDir }} + {{ $remoteDbTitle := $targetDir.Title }} + {{ $externalPages := $targetDir.RegularPages }} + + {{/* Traverse directories if needed */}} + {{ if not $externalPages }} + {{ $subTools := $targetDir.GetPage "tools" }} + {{ if $subTools }} + {{ $externalPages = $subTools.RegularPages }} + {{ end }} + {{ else }} + {{ if eq $targetDir.Title "Tools" }} + {{ if $targetDir.Parent }} + {{ $remoteDbTitle = $targetDir.Parent.Title }} + {{ end }} + {{ end }} + {{ end }} - {{ if $toolDir }} - {{ $externalPages := $toolDir.RegularPages }} + {{/* Pre-filter Inherited Tools */}} + {{ $validExternalTools := slice }} + {{ range $externalPages }} + {{ if not .Params.is_wrapper }} + {{ $validExternalTools = $validExternalTools | append . }} + {{ end }} + {{ end }} + + {{/* Display Inherited Tools if valid ones exist */}} + {{ if gt (len $validExternalTools) 0 }} + + {{/* Print the main H3 if the native tools block didn't already print it */}} + {{ if not $headerPrinted }} +

{{ $dbTitle }} Tools

+ {{ $headerPrinted = true }} + {{ end }} - {{ if $externalPages }} - {{/* Print the dynamic compatibility sentence */}} -

{{ $currentTitle }} maintains full compatibility with {{ $toolDir.Title }}, allowing you to use the following tools with your {{ $currentTitle }} source:

+ {{/* Always print the compatibility sentence */}} +

{{ $dbTitle }} maintains full compatibility with {{ $remoteDbTitle }}, allowing you to use the following tools with this connection:

@@ -46,11 +103,11 @@

{{ $currentTitle }} Tools

- {{ range $externalPages }} - - - - + {{ range $validExternalTools }} + + + + {{ end }}
{{ .Title }}{{ .Description | default "No description provided." }}
{{ .Title }}{{ .Description | default "No description provided." }}
@@ -62,7 +119,7 @@

{{ $currentTitle }} Tools

{{ end }} {{ end }} -{{/* Fallback if absolutely no tools exist anywhere */}} -{{ if and (not $currentPages) (not $dirsParam) }} +{{/* 4. Fallback if absolutely NO tools exist anywhere */}} +{{ if and (not $headerPrinted) (not $dirsParam) }}

No tools found to display.

{{ end }} \ No newline at end of file diff --git a/.hugo/layouts/shortcodes/samples-gallery.html b/.hugo/layouts/shortcodes/samples-gallery.html new file mode 100644 index 000000000000..968d67d5f672 --- /dev/null +++ b/.hugo/layouts/shortcodes/samples-gallery.html @@ -0,0 +1,364 @@ +{{/* 1. Gather all samples based STRICTLY on explicit frontmatter and sort alphabetically */}} +{{ $samples := (where .Site.Pages "Params.is_sample" true).ByTitle }} + +{{/* 2. Extract and sort all unique sample filters */}} +{{ $allFilters := slice }} +{{ range $samples }} + {{ if .Params.sample_filters }} + {{ range .Params.sample_filters }} + {{ $allFilters = $allFilters | append (lower .) }} + {{ end }} + {{ end }} +{{ end }} +{{ $uniqueFilters := $allFilters | uniq | sort }} + +{{/* 3. Render the UI */}} +
+ + +
+ + +
+ + +
+ + {{ range $uniqueFilters }} + + {{ end }} +
+ + +
+ {{ range $samples }} + {{ $pageFilters := default slice .Params.sample_filters }} +
+ +
+ +
+

{{ .Title }}

+
{{ .Description | default "Learn how to build this integration." | markdownify }}
+
+ +
+ {{ range $pageFilters }} + {{ . | title }} + {{ end }} +
+
+ {{ end }} +
+ + + +
+ + + + \ No newline at end of file diff --git a/DEVELOPER.md b/DEVELOPER.md index fb70241743e9..633acd6b3999 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -227,7 +227,7 @@ tools. * **(Optional) Add samples** to the `docs/en/build-with-mcp-toolbox/` directory. -* **Adding Top-Level Sections:** If you add a completely new top-level documentation directory (e.g., a new section alongside `integrations`, `user-guide`, etc.), you **must** update the AI documentation layout files located at `.hugo/layouts/index.llms.txt` and `.hugo/layouts/index.llms-full.txt`. Specifically, you need to update the "Diátaxis Narrative Framework" preamble in both files so that the AI models understand the purpose of your new section. +* **Adding Top-Level Sections:** If you add a completely new top-level documentation directory (e.g., a new section alongside `integrations`, `documentation`, etc.), you **must** update the AI documentation layout files located at `.hugo/layouts/index.llms.txt` and `.hugo/layouts/index.llms-full.txt`. Specifically, you need to update the "Diátaxis Narrative Framework" preamble in both files so that the AI models understand the purpose of your new section. #### Adding Prebuilt Tools diff --git a/README.md b/README.md index 5660deaa56a9..31914ebf140a 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ between agents and applications and update those tools without necessarily redeploying your application.

-architecture +architecture

## Getting Started diff --git a/docs/en/_index.md b/docs/en/_index.md index e6e2cb82a7fe..a75e626dcb4e 100644 --- a/docs/en/_index.md +++ b/docs/en/_index.md @@ -7,7 +7,7 @@ weight: 1 - - + + diff --git a/docs/en/build-with-mcp-toolbox/alloydb/_index.md b/docs/en/build-with-mcp-toolbox/alloydb/_index.md deleted file mode 100644 index 963c99565d68..000000000000 --- a/docs/en/build-with-mcp-toolbox/alloydb/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "AlloyDB" -type: docs -weight: 7 -description: > - How to get started with Toolbox using AlloyDB. ---- diff --git a/docs/en/build-with-mcp-toolbox/bigquery/_index.md b/docs/en/build-with-mcp-toolbox/bigquery/_index.md deleted file mode 100644 index 621545be1c69..000000000000 --- a/docs/en/build-with-mcp-toolbox/bigquery/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "BigQuery" -type: docs -weight: 7 -description: > - How to get started with Toolbox using BigQuery. ---- diff --git a/docs/en/build-with-mcp-toolbox/looker/_index.md b/docs/en/build-with-mcp-toolbox/looker/_index.md deleted file mode 100644 index 9a8ddc02cd74..000000000000 --- a/docs/en/build-with-mcp-toolbox/looker/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Looker" -type: docs -weight: 7 -description: > - How to get started with Toolbox using Looker. ---- diff --git a/docs/en/build-with-mcp-toolbox/neo4j/_index.md b/docs/en/build-with-mcp-toolbox/neo4j/_index.md deleted file mode 100644 index 0e60da597b77..000000000000 --- a/docs/en/build-with-mcp-toolbox/neo4j/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Neo4j" -type: docs -weight: 7 -description: > - How to get started with Toolbox using Neo4j. ---- diff --git a/docs/en/documentation/_index.md b/docs/en/documentation/_index.md new file mode 100644 index 000000000000..c3bae20e58bb --- /dev/null +++ b/docs/en/documentation/_index.md @@ -0,0 +1,8 @@ +--- +title: "Documentation" +type: docs +notoc: false +weight: 3 +description: > + A complete documentation guide for MCP Toolbox +--- \ No newline at end of file diff --git a/docs/en/user-guide/configuration/_index.md b/docs/en/documentation/configuration/_index.md similarity index 100% rename from docs/en/user-guide/configuration/_index.md rename to docs/en/documentation/configuration/_index.md diff --git a/docs/en/user-guide/configuration/authentication/_index.md b/docs/en/documentation/configuration/authentication/_index.md similarity index 100% rename from docs/en/user-guide/configuration/authentication/_index.md rename to docs/en/documentation/configuration/authentication/_index.md diff --git a/docs/en/user-guide/configuration/authentication/google.md b/docs/en/documentation/configuration/authentication/google.md similarity index 100% rename from docs/en/user-guide/configuration/authentication/google.md rename to docs/en/documentation/configuration/authentication/google.md diff --git a/docs/en/user-guide/configuration/embedding-models/_index.md b/docs/en/documentation/configuration/embedding-models/_index.md similarity index 100% rename from docs/en/user-guide/configuration/embedding-models/_index.md rename to docs/en/documentation/configuration/embedding-models/_index.md diff --git a/docs/en/user-guide/configuration/embedding-models/gemini.md b/docs/en/documentation/configuration/embedding-models/gemini.md similarity index 100% rename from docs/en/user-guide/configuration/embedding-models/gemini.md rename to docs/en/documentation/configuration/embedding-models/gemini.md diff --git a/docs/en/user-guide/configuration/prebuilt-configs/_index.md b/docs/en/documentation/configuration/prebuilt-configs/_index.md similarity index 100% rename from docs/en/user-guide/configuration/prebuilt-configs/_index.md rename to docs/en/documentation/configuration/prebuilt-configs/_index.md diff --git a/docs/en/user-guide/configuration/prompts/_index.md b/docs/en/documentation/configuration/prompts/_index.md similarity index 100% rename from docs/en/user-guide/configuration/prompts/_index.md rename to docs/en/documentation/configuration/prompts/_index.md diff --git a/docs/en/user-guide/configuration/prompts/custom/_index.md b/docs/en/documentation/configuration/prompts/custom/_index.md similarity index 100% rename from docs/en/user-guide/configuration/prompts/custom/_index.md rename to docs/en/documentation/configuration/prompts/custom/_index.md diff --git a/docs/en/user-guide/configuration/sources/_index.md b/docs/en/documentation/configuration/sources/_index.md similarity index 100% rename from docs/en/user-guide/configuration/sources/_index.md rename to docs/en/documentation/configuration/sources/_index.md diff --git a/docs/en/user-guide/configuration/toolbox-ui/edit-headers.gif b/docs/en/documentation/configuration/toolbox-ui/edit-headers.gif similarity index 100% rename from docs/en/user-guide/configuration/toolbox-ui/edit-headers.gif rename to docs/en/documentation/configuration/toolbox-ui/edit-headers.gif diff --git a/docs/en/user-guide/configuration/toolbox-ui/edit-headers.png b/docs/en/documentation/configuration/toolbox-ui/edit-headers.png similarity index 100% rename from docs/en/user-guide/configuration/toolbox-ui/edit-headers.png rename to docs/en/documentation/configuration/toolbox-ui/edit-headers.png diff --git a/docs/en/user-guide/configuration/toolbox-ui/index.md b/docs/en/documentation/configuration/toolbox-ui/index.md similarity index 100% rename from docs/en/user-guide/configuration/toolbox-ui/index.md rename to docs/en/documentation/configuration/toolbox-ui/index.md diff --git a/docs/en/user-guide/configuration/toolbox-ui/optional-param-checked.png b/docs/en/documentation/configuration/toolbox-ui/optional-param-checked.png similarity index 100% rename from docs/en/user-guide/configuration/toolbox-ui/optional-param-checked.png rename to docs/en/documentation/configuration/toolbox-ui/optional-param-checked.png diff --git a/docs/en/user-guide/configuration/toolbox-ui/optional-param-unchecked.png b/docs/en/documentation/configuration/toolbox-ui/optional-param-unchecked.png similarity index 100% rename from docs/en/user-guide/configuration/toolbox-ui/optional-param-unchecked.png rename to docs/en/documentation/configuration/toolbox-ui/optional-param-unchecked.png diff --git a/docs/en/user-guide/configuration/toolbox-ui/run-tool.gif b/docs/en/documentation/configuration/toolbox-ui/run-tool.gif similarity index 100% rename from docs/en/user-guide/configuration/toolbox-ui/run-tool.gif rename to docs/en/documentation/configuration/toolbox-ui/run-tool.gif diff --git a/docs/en/user-guide/configuration/toolbox-ui/tools.png b/docs/en/documentation/configuration/toolbox-ui/tools.png similarity index 100% rename from docs/en/user-guide/configuration/toolbox-ui/tools.png rename to docs/en/documentation/configuration/toolbox-ui/tools.png diff --git a/docs/en/user-guide/configuration/toolbox-ui/toolsets.png b/docs/en/documentation/configuration/toolbox-ui/toolsets.png similarity index 100% rename from docs/en/user-guide/configuration/toolbox-ui/toolsets.png rename to docs/en/documentation/configuration/toolbox-ui/toolsets.png diff --git a/docs/en/user-guide/configuration/tools/_index.md b/docs/en/documentation/configuration/tools/_index.md similarity index 100% rename from docs/en/user-guide/configuration/tools/_index.md rename to docs/en/documentation/configuration/tools/_index.md diff --git a/docs/en/user-guide/configuration/tools/invoke_tool.md b/docs/en/documentation/configuration/tools/invoke_tool.md similarity index 100% rename from docs/en/user-guide/configuration/tools/invoke_tool.md rename to docs/en/documentation/configuration/tools/invoke_tool.md diff --git a/docs/en/user-guide/configuration/toolsets/_index.md b/docs/en/documentation/configuration/toolsets/_index.md similarity index 100% rename from docs/en/user-guide/configuration/toolsets/_index.md rename to docs/en/documentation/configuration/toolsets/_index.md diff --git a/docs/en/user-guide/configuration/toolsets/generate_skill.md b/docs/en/documentation/configuration/toolsets/generate_skill.md similarity index 100% rename from docs/en/user-guide/configuration/toolsets/generate_skill.md rename to docs/en/documentation/configuration/toolsets/generate_skill.md diff --git a/docs/en/user-guide/connect-to/_index.md b/docs/en/documentation/connect-to/_index.md similarity index 76% rename from docs/en/user-guide/connect-to/_index.md rename to docs/en/documentation/connect-to/_index.md index 853cab667105..53b93f887a63 100644 --- a/docs/en/user-guide/connect-to/_index.md +++ b/docs/en/documentation/connect-to/_index.md @@ -14,9 +14,9 @@ Choose your connection method below based on your use case: If you are building custom AI agents or orchestrating multi-step workflows in code, use our officially supported Client SDKs. These SDKs allow your application to fetch tool schemas and execute queries dynamically at runtime. -* **[Python SDKs](client-sdks/python-sdk/_index.md)**: Connect using our Core SDK, or leverage native integrations for LangChain, LlamaIndex, and the Agent Development Kit (ADK). -* **[JavaScript / TypeScript SDKs](client-sdks/javascript-sdk/_index.md)**: Build Node.js applications using our Core SDK or ADK integrations. -* **[Go SDKs](client-sdks/go-sdk/_index.md)**: Build highly concurrent agents with our Go Core SDK, or use our integrations for Genkit and ADK. +* **[Python SDKs](toolbox-sdks/python-sdk/_index.md)**: Connect using our Core SDK, or leverage native integrations for LangChain, LlamaIndex, and the Agent Development Kit (ADK). +* **[JavaScript / TypeScript SDKs](toolbox-sdks/javascript-sdk/_index.md)**: Build Node.js applications using our Core SDK or ADK integrations. +* **[Go SDKs](toolbox-sdks/go-sdk/_index.md)**: Build highly concurrent agents with our Go Core SDK, or use our integrations for Genkit and ADK. ## MCP Clients & CLIs diff --git a/docs/en/user-guide/connect-to/client-sdks/_index.md b/docs/en/documentation/connect-to/client-sdks/_index.md similarity index 88% rename from docs/en/user-guide/connect-to/client-sdks/_index.md rename to docs/en/documentation/connect-to/client-sdks/_index.md index c40787cb8324..5a21d8624908 100644 --- a/docs/en/user-guide/connect-to/client-sdks/_index.md +++ b/docs/en/documentation/connect-to/client-sdks/_index.md @@ -1,12 +1,12 @@ --- -title: "Client SDKs" +title: "Toolbox SDKs" type: docs -weight: 1 +weight: 2 description: > Integrate the MCP Toolbox directly into your custom applications and AI agents using our official SDKs for Python, JavaScript/TypeScript, and Go. --- -Our Client SDKs provide the foundational building blocks for connecting your custom applications to the MCP Toolbox server. +Our Toolbox Client SDKs provide the foundational building blocks for connecting your custom applications to the MCP Toolbox server. Whether you are writing a simple script to execute a single query or building a complex, multi-agent orchestration system, these SDKs handle the underlying Model Context Protocol (MCP) communication so you can focus on your business logic. diff --git a/docs/en/user-guide/connect-to/client-sdks/go-sdk/_index.md b/docs/en/documentation/connect-to/client-sdks/go-sdk/_index.md similarity index 99% rename from docs/en/user-guide/connect-to/client-sdks/go-sdk/_index.md rename to docs/en/documentation/connect-to/client-sdks/go-sdk/_index.md index 41b705b61a2b..81a5de2dfd6d 100644 --- a/docs/en/user-guide/connect-to/client-sdks/go-sdk/_index.md +++ b/docs/en/documentation/connect-to/client-sdks/go-sdk/_index.md @@ -70,3 +70,5 @@ To get started using Toolbox tools with an application, follow these general ste {{< notice note >}} Source code for [Go-sdk](https://github.com/googleapis/mcp-toolbox-sdk-go) {{< /notice >}} + +## Explore the Go SDKs \ No newline at end of file diff --git a/docs/en/user-guide/connect-to/client-sdks/go-sdk/core/_index.md b/docs/en/documentation/connect-to/client-sdks/go-sdk/core/_index.md similarity index 99% rename from docs/en/user-guide/connect-to/client-sdks/go-sdk/core/_index.md rename to docs/en/documentation/connect-to/client-sdks/go-sdk/core/_index.md index 253dcf7a9a6f..e597cffcc78c 100644 --- a/docs/en/user-guide/connect-to/client-sdks/go-sdk/core/_index.md +++ b/docs/en/documentation/connect-to/client-sdks/go-sdk/core/_index.md @@ -179,7 +179,7 @@ result, err := tool.Invoke(ctx, inputs) ``` {{< notice tip >}} -For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../../build-with-mcp-toolbox/local_quickstart.md). +For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../getting-started/local_quickstart_go.md). {{< /notice >}} ## Client to Server Authentication diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/go.md b/docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/_index.md similarity index 85% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/go.md rename to docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/_index.md index 4f2dec98ebd1..2946e261a8fa 100644 --- a/docs/en/build-with-mcp-toolbox/pre-post-processing/go.md +++ b/docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/_index.md @@ -1,14 +1,16 @@ --- -title: "Go" +title: "Go: Pre & Post Processing" type: docs -weight: 3 +weight: 4 description: > How to add pre- and post- processing to your Agents using Go. +sample_filters: ["Pre & Post Processing", "Go", "ADK"] +is_sample: true --- ## Prerequisites -This tutorial assumes that you have set up MCP Toolbox with a basic agent as described in the [local quickstart](../../build-with-mcp-toolbox/local_quickstart_go.md). +This tutorial assumes that you have set up MCP Toolbox with a basic agent as described in the [local quickstart](../../../../getting-started/local_quickstart_go.md). This guide demonstrates how to implement these patterns in your Toolbox applications. diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/go/adk/agent.go b/docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/adk/agent.go similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/go/adk/agent.go rename to docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/adk/agent.go diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/go/adk/go.mod b/docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/adk/go.mod similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/go/adk/go.mod rename to docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/adk/go.mod diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/go/adk/go.sum b/docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/adk/go.sum similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/go/adk/go.sum rename to docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/adk/go.sum diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/go/agent_test.go b/docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/agent_test.go similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/go/agent_test.go rename to docs/en/documentation/connect-to/client-sdks/go-sdk/pre-post-processing/agent_test.go diff --git a/docs/en/user-guide/connect-to/client-sdks/go-sdk/tbadk/_index.md b/docs/en/documentation/connect-to/client-sdks/go-sdk/tbadk/_index.md similarity index 99% rename from docs/en/user-guide/connect-to/client-sdks/go-sdk/tbadk/_index.md rename to docs/en/documentation/connect-to/client-sdks/go-sdk/tbadk/_index.md index 0a1d7f1c0fdf..cd6961dcb46b 100644 --- a/docs/en/user-guide/connect-to/client-sdks/go-sdk/tbadk/_index.md +++ b/docs/en/documentation/connect-to/client-sdks/go-sdk/tbadk/_index.md @@ -178,7 +178,7 @@ result, err := tool.Run(ctx, inputs) ``` {{< notice tip >}}For a more comprehensive guide on setting up the Toolbox service itself, which -you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../../build-with-mcp-toolbox/local_quickstart_go.md). +you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../getting-started/local_quickstart_go.md). {{< /notice >}} ## Client to Server Authentication diff --git a/docs/en/user-guide/connect-to/client-sdks/go-sdk/tbgenkit/_index.md b/docs/en/documentation/connect-to/client-sdks/go-sdk/tbgenkit/_index.md similarity index 100% rename from docs/en/user-guide/connect-to/client-sdks/go-sdk/tbgenkit/_index.md rename to docs/en/documentation/connect-to/client-sdks/go-sdk/tbgenkit/_index.md diff --git a/docs/en/user-guide/connect-to/client-sdks/javascript-sdk/_index.md b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/_index.md similarity index 98% rename from docs/en/user-guide/connect-to/client-sdks/javascript-sdk/_index.md rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/_index.md index 0666bee0e871..12fda824c9b0 100644 --- a/docs/en/user-guide/connect-to/client-sdks/javascript-sdk/_index.md +++ b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/_index.md @@ -69,3 +69,5 @@ To get started using Toolbox tools with an application, follow these general ste {{< notice note >}} Source code for [js-sdk](https://github.com/googleapis/mcp-toolbox-sdk-js) {{< /notice >}} + +## Explore the Javascript SDKs \ No newline at end of file diff --git a/docs/en/user-guide/connect-to/client-sdks/javascript-sdk/adk/index.md b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/adk/index.md similarity index 99% rename from docs/en/user-guide/connect-to/client-sdks/javascript-sdk/adk/index.md rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/adk/index.md index e2cf54cc1c15..d02c2e4b7d2b 100644 --- a/docs/en/user-guide/connect-to/client-sdks/javascript-sdk/adk/index.md +++ b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/adk/index.md @@ -147,7 +147,7 @@ const result = await tool.runAsync(args: {a: 5, b: 2}) ``` {{< notice tip>}} -For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../../build-with-mcp-toolbox/local_quickstart_js.md). +For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../getting-started/local_quickstart_js.md). {{< /notice >}} ## Client to Server Authentication diff --git a/docs/en/user-guide/connect-to/client-sdks/javascript-sdk/core/index.md b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/core/index.md similarity index 99% rename from docs/en/user-guide/connect-to/client-sdks/javascript-sdk/core/index.md rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/core/index.md index cb5dc4d7428b..b06afbb64a83 100644 --- a/docs/en/user-guide/connect-to/client-sdks/javascript-sdk/core/index.md +++ b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/core/index.md @@ -147,7 +147,7 @@ const result = await tool({a: 5, b: 2}) ``` {{< notice tip>}} -For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../../build-with-mcp-toolbox/local_quickstart_js.md). +For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../getting-started/local_quickstart_js.md). {{< /notice >}} ## Client to Server Authentication diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/js.md b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/_index.md similarity index 89% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/js.md rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/_index.md index f19b8a171efa..af537566b7e2 100644 --- a/docs/en/build-with-mcp-toolbox/pre-post-processing/js.md +++ b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/_index.md @@ -1,14 +1,16 @@ --- -title: "Javascript" +title: "Javascript: Pre & Post Processing" type: docs weight: 2 description: > How to add pre- and post- processing to your Agents using JS. +sample_filters: ["Pre & Post Processing", "Javascript", "ADK", "LangChain"] +is_sample: true --- ## Prerequisites -This tutorial assumes that you have set up MCP Toolbox with a basic agent as described in the [local quickstart](../../build-with-mcp-toolbox/local_quickstart_js.md). +This tutorial assumes that you have set up MCP Toolbox with a basic agent as described in the [local quickstart](../../../../getting-started/local_quickstart_js.md). This guide demonstrates how to implement these patterns in your Toolbox applications. diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/js/adk/agent.js b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/adk/agent.js similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/js/adk/agent.js rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/adk/agent.js diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/js/adk/package-lock.json b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/adk/package-lock.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/js/adk/package-lock.json rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/adk/package-lock.json diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/js/adk/package.json b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/adk/package.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/js/adk/package.json rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/adk/package.json diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/js/agent.test.js b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/agent.test.js similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/js/agent.test.js rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/agent.test.js diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/js/langchain/agent.js b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/langchain/agent.js similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/js/langchain/agent.js rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/langchain/agent.js diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/js/langchain/package-lock.json b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/langchain/package-lock.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/js/langchain/package-lock.json rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/langchain/package-lock.json diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/js/langchain/package.json b/docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/langchain/package.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/js/langchain/package.json rename to docs/en/documentation/connect-to/client-sdks/javascript-sdk/pre-post-processing/langchain/package.json diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/_index.md b/docs/en/documentation/connect-to/client-sdks/pre-post-processing/_index.md similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/_index.md rename to docs/en/documentation/connect-to/client-sdks/pre-post-processing/_index.md diff --git a/docs/en/user-guide/connect-to/client-sdks/python-sdk/_index.md b/docs/en/documentation/connect-to/client-sdks/python-sdk/_index.md similarity index 99% rename from docs/en/user-guide/connect-to/client-sdks/python-sdk/_index.md rename to docs/en/documentation/connect-to/client-sdks/python-sdk/_index.md index 705662026909..b44d22ed80db 100644 --- a/docs/en/user-guide/connect-to/client-sdks/python-sdk/_index.md +++ b/docs/en/documentation/connect-to/client-sdks/python-sdk/_index.md @@ -97,3 +97,6 @@ To get started using Toolbox tools with an application, follow these general ste {{< notice note >}} Source code for [python-sdk](https://github.com/googleapis/mcp-toolbox-sdk-python) {{< /notice >}} + + +## Explore the Python SDKs \ No newline at end of file diff --git a/docs/en/user-guide/connect-to/client-sdks/python-sdk/adk/index.md b/docs/en/documentation/connect-to/client-sdks/python-sdk/adk/index.md similarity index 100% rename from docs/en/user-guide/connect-to/client-sdks/python-sdk/adk/index.md rename to docs/en/documentation/connect-to/client-sdks/python-sdk/adk/index.md diff --git a/docs/en/user-guide/connect-to/client-sdks/python-sdk/core/index.md b/docs/en/documentation/connect-to/client-sdks/python-sdk/core/index.md similarity index 99% rename from docs/en/user-guide/connect-to/client-sdks/python-sdk/core/index.md rename to docs/en/documentation/connect-to/client-sdks/python-sdk/core/index.md index b1573feffb3b..7b870f0bcd95 100644 --- a/docs/en/user-guide/connect-to/client-sdks/python-sdk/core/index.md +++ b/docs/en/documentation/connect-to/client-sdks/python-sdk/core/index.md @@ -50,7 +50,7 @@ if __name__ == "__main__": {{< notice tip>}} -For a complete, end-to-end example including setting up the service and using an SDK, see the full tutorial: [**Toolbox Quickstart Tutorial**](../../../../../build-with-mcp-toolbox/local_quickstart.md) +For a complete, end-to-end example including setting up the service and using an SDK, see the full tutorial: [**Toolbox Quickstart Tutorial**](../../../../getting-started/local_quickstart.md) {{< /notice >}} {{< notice note>}} @@ -177,7 +177,7 @@ result = await tool("foo", bar="baz") ``` {{< notice tip>}} -For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../../build-with-mcp-toolbox/local_quickstart.md). +For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../getting-started/local_quickstart.md). {{< /notice >}} ## Synchronous Usage diff --git a/docs/en/user-guide/connect-to/client-sdks/python-sdk/langchain/index.md b/docs/en/documentation/connect-to/client-sdks/python-sdk/langchain/index.md similarity index 99% rename from docs/en/user-guide/connect-to/client-sdks/python-sdk/langchain/index.md rename to docs/en/documentation/connect-to/client-sdks/python-sdk/langchain/index.md index c80f668b70e7..86a9763bb73f 100644 --- a/docs/en/user-guide/connect-to/client-sdks/python-sdk/langchain/index.md +++ b/docs/en/documentation/connect-to/client-sdks/python-sdk/langchain/index.md @@ -41,7 +41,7 @@ async with ToolboxClient("http://127.0.0.1:5000") as toolbox: message.pretty_print() ``` {{< notice tip >}} -For a complete, end-to-end example including setting up the service and using an SDK, see the full tutorial: [Toolbox Quickstart Tutorial](../../../../../build-with-mcp-toolbox/local_quickstart.md) +For a complete, end-to-end example including setting up the service and using an SDK, see the full tutorial: [Toolbox Quickstart Tutorial](../../../../getting-started/local_quickstart.md) {{< /notice >}} ## Usage diff --git a/docs/en/user-guide/connect-to/client-sdks/python-sdk/llamaindex/index.md b/docs/en/documentation/connect-to/client-sdks/python-sdk/llamaindex/index.md similarity index 99% rename from docs/en/user-guide/connect-to/client-sdks/python-sdk/llamaindex/index.md rename to docs/en/documentation/connect-to/client-sdks/python-sdk/llamaindex/index.md index 8d0bde9d857a..f2b1c58b4044 100644 --- a/docs/en/user-guide/connect-to/client-sdks/python-sdk/llamaindex/index.md +++ b/docs/en/documentation/connect-to/client-sdks/python-sdk/llamaindex/index.md @@ -49,7 +49,7 @@ asyncio.run(run_agent()) ``` {{< notice tip >}} -For a complete, end-to-end example including setting up the service and using an SDK, see the full tutorial: [Toolbox Quickstart Tutorial](../../../../../build-with-mcp-toolbox/local_quickstart.md) +For a complete, end-to-end example including setting up the service and using an SDK, see the full tutorial: [Toolbox Quickstart Tutorial](../../../../getting-started/local_quickstart.md) {{< /notice >}} ## Usage diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/python/__init__.py b/docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/__init__.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/python/__init__.py rename to docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/__init__.py diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/python.md b/docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/_index.md similarity index 88% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/python.md rename to docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/_index.md index 621ec197d36a..1c65e26dfa33 100644 --- a/docs/en/build-with-mcp-toolbox/pre-post-processing/python.md +++ b/docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/_index.md @@ -1,14 +1,16 @@ --- -title: "Python" +title: "Python: Pre & Post Processing" type: docs -weight: 1 +weight: 5 description: > How to add pre- and post- processing to your Agents using Python. +sample_filters: ["Pre & Post Processing", "Python", "ADK", "LangChain"] +is_sample: true --- ## Prerequisites -This tutorial assumes that you have set up MCP Toolbox with a basic agent as described in the [local quickstart](../../build-with-mcp-toolbox/local_quickstart.md). +This tutorial assumes that you have set up MCP Toolbox with a basic agent as described in the [local quickstart](../../../../getting-started/local_quickstart.md). This guide demonstrates how to implement these patterns in your Toolbox applications. diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/python/adk/agent.py b/docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/adk/agent.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/python/adk/agent.py rename to docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/adk/agent.py diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/python/adk/requirements.txt b/docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/adk/requirements.txt similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/python/adk/requirements.txt rename to docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/adk/requirements.txt diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/python/agent_test.py b/docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/agent_test.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/python/agent_test.py rename to docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/agent_test.py diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/python/langchain/agent.py b/docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/langchain/agent.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/python/langchain/agent.py rename to docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/langchain/agent.py diff --git a/docs/en/build-with-mcp-toolbox/pre-post-processing/python/langchain/requirements.txt b/docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/langchain/requirements.txt similarity index 100% rename from docs/en/build-with-mcp-toolbox/pre-post-processing/python/langchain/requirements.txt rename to docs/en/documentation/connect-to/client-sdks/python-sdk/pre-post-processing/langchain/requirements.txt diff --git a/docs/en/user-guide/connect-to/gemini-cli/_index.md b/docs/en/documentation/connect-to/gemini-cli/_index.md similarity index 100% rename from docs/en/user-guide/connect-to/gemini-cli/_index.md rename to docs/en/documentation/connect-to/gemini-cli/_index.md diff --git a/docs/en/user-guide/connect-to/ides/_index.md b/docs/en/documentation/connect-to/ides/_index.md similarity index 100% rename from docs/en/user-guide/connect-to/ides/_index.md rename to docs/en/documentation/connect-to/ides/_index.md diff --git a/docs/en/documentation/connect-to/ides/alloydb_pg_admin_mcp.md b/docs/en/documentation/connect-to/ides/alloydb_pg_admin_mcp.md new file mode 100644 index 000000000000..32f8dd4082ca --- /dev/null +++ b/docs/en/documentation/connect-to/ides/alloydb_pg_admin_mcp.md @@ -0,0 +1,22 @@ +--- +title: "AlloyDB Admin API using MCP" +type: docs +weight: 2 +description: > + Create your AlloyDB database with MCP Toolbox. +manualLink: "https://cloud.google.com/alloydb/docs/connect-ide-using-mcp-toolbox" +manualLinkTarget: _blank +--- + + + + Redirecting to AlloyDB Docs + + + + +

Connecting to AlloyDB documentation... If you are not automatically redirected, please + click here to view the docs. +

+ + \ No newline at end of file diff --git a/docs/en/documentation/connect-to/ides/alloydb_pg_mcp.md b/docs/en/documentation/connect-to/ides/alloydb_pg_mcp.md new file mode 100644 index 000000000000..a8b2f3feb8ec --- /dev/null +++ b/docs/en/documentation/connect-to/ides/alloydb_pg_mcp.md @@ -0,0 +1,22 @@ +--- +title: "AlloyDB using MCP" +type: docs +weight: 2 +description: > + Connect your IDE to AlloyDB using Toolbox. +manualLink: "https://cloud.google.com/alloydb/docs/connect-ide-using-mcp-toolbox" +manualLinkTarget: _blank +--- + + + + Redirecting to AlloyDB using MCP + + + + +

Connecting to AlloyDB using MCP... If you are not automatically redirected, please + click here to proceed. +

+ + \ No newline at end of file diff --git a/docs/en/documentation/connect-to/ides/bigquery_mcp.md b/docs/en/documentation/connect-to/ides/bigquery_mcp.md new file mode 100644 index 000000000000..9ada66a4c8eb --- /dev/null +++ b/docs/en/documentation/connect-to/ides/bigquery_mcp.md @@ -0,0 +1,22 @@ +--- +title: "BigQuery using MCP" +type: docs +weight: 2 +description: > + Connect your IDE to BigQuery using Toolbox. +manualLink: "https://cloud.google.com/bigquery/docs/pre-built-tools-with-mcp-toolbox" +manualLinkTarget: _blank +--- + + + + Redirecting to BigQuery using MCP + + + + +

Connecting to BigQuery using MCP... If you are not automatically redirected, please + click here to proceed. +

+ + \ No newline at end of file diff --git a/docs/en/user-guide/connect-to/ides/cloud_sql_mssql_admin_mcp.md b/docs/en/documentation/connect-to/ides/cloud_sql_mssql_admin_mcp.md similarity index 100% rename from docs/en/user-guide/connect-to/ides/cloud_sql_mssql_admin_mcp.md rename to docs/en/documentation/connect-to/ides/cloud_sql_mssql_admin_mcp.md diff --git a/docs/en/documentation/connect-to/ides/cloud_sql_mssql_mcp.md b/docs/en/documentation/connect-to/ides/cloud_sql_mssql_mcp.md new file mode 100644 index 000000000000..488fccf5f8a4 --- /dev/null +++ b/docs/en/documentation/connect-to/ides/cloud_sql_mssql_mcp.md @@ -0,0 +1,22 @@ +--- +title: "Cloud SQL for SQL Server using MCP" +type: docs +weight: 2 +description: > + Connect your IDE to Cloud SQL for SQL Server using Toolbox. +manualLink: "https://cloud.google.com/sql/docs/sqlserver/pre-built-tools-with-mcp-toolbox" +manualLinkTarget: _blank +--- + + + + Redirecting to Cloud SQL for SQL Server using MCP + + + + +

Connecting to Cloud SQL for SQL Server using MCP... If you are not automatically redirected, please + click here to proceed. +

+ + \ No newline at end of file diff --git a/docs/en/user-guide/connect-to/ides/cloud_sql_mysql_admin_mcp.md b/docs/en/documentation/connect-to/ides/cloud_sql_mysql_admin_mcp.md similarity index 100% rename from docs/en/user-guide/connect-to/ides/cloud_sql_mysql_admin_mcp.md rename to docs/en/documentation/connect-to/ides/cloud_sql_mysql_admin_mcp.md diff --git a/docs/en/documentation/connect-to/ides/cloud_sql_mysql_mcp.md b/docs/en/documentation/connect-to/ides/cloud_sql_mysql_mcp.md new file mode 100644 index 000000000000..997aea7b7358 --- /dev/null +++ b/docs/en/documentation/connect-to/ides/cloud_sql_mysql_mcp.md @@ -0,0 +1,22 @@ +--- +title: "Cloud SQL for MySQL using MCP" +type: docs +weight: 2 +description: > + Connect your IDE to Cloud SQL for MySQL using Toolbox. +manualLink: "https://cloud.google.com/sql/docs/mysql/pre-built-tools-with-mcp-toolbox" +manualLinkTarget: _blank +--- + + + + Redirecting to Cloud SQL for MySQL using MCP + + + + +

Connecting to Cloud SQL for MySQL using MCP... If you are not automatically redirected, please + click here to proceed. +

+ + \ No newline at end of file diff --git a/docs/en/user-guide/connect-to/ides/cloud_sql_pg_admin_mcp.md b/docs/en/documentation/connect-to/ides/cloud_sql_pg_admin_mcp.md similarity index 100% rename from docs/en/user-guide/connect-to/ides/cloud_sql_pg_admin_mcp.md rename to docs/en/documentation/connect-to/ides/cloud_sql_pg_admin_mcp.md diff --git a/docs/en/documentation/connect-to/ides/cloud_sql_pg_mcp.md b/docs/en/documentation/connect-to/ides/cloud_sql_pg_mcp.md new file mode 100644 index 000000000000..017b7160c708 --- /dev/null +++ b/docs/en/documentation/connect-to/ides/cloud_sql_pg_mcp.md @@ -0,0 +1,22 @@ +--- +title: "Cloud SQL for Postgres using MCP" +type: docs +weight: 2 +description: > + Connect your IDE to Cloud SQL for Postgres using Toolbox. +manualLink: "https://cloud.google.com/sql/docs/postgres/pre-built-tools-with-mcp-toolbox" +manualLinkTarget: _blank +--- + + + + Redirecting to Cloud SQL for Postgres using MCP + + + + +

Connecting to Cloud SQL for Postgres using MCP... If you are not automatically redirected, please + click here to proceed. +

+ + \ No newline at end of file diff --git a/docs/en/documentation/connect-to/ides/firestore_mcp.md b/docs/en/documentation/connect-to/ides/firestore_mcp.md new file mode 100644 index 000000000000..57bbd90813e6 --- /dev/null +++ b/docs/en/documentation/connect-to/ides/firestore_mcp.md @@ -0,0 +1,22 @@ +--- +title: "Firestore using MCP" +type: docs +weight: 2 +description: > + Connect your IDE to Firestore using Toolbox. +manualLink: "https://cloud.google.com/firestore/native/docs/connect-ide-using-mcp-toolbox" +manualLinkTarget: _blank +--- + + + + Redirecting to Firestore using MCP + + + + +

Connecting to Firestore using MCP... If you are not automatically redirected, please + click here to proceed. +

+ + \ No newline at end of file diff --git a/docs/en/user-guide/connect-to/ides/looker_mcp.md b/docs/en/documentation/connect-to/ides/looker_mcp.md similarity index 100% rename from docs/en/user-guide/connect-to/ides/looker_mcp.md rename to docs/en/documentation/connect-to/ides/looker_mcp.md diff --git a/docs/en/user-guide/connect-to/ides/mssql_mcp.md b/docs/en/documentation/connect-to/ides/mssql_mcp.md similarity index 100% rename from docs/en/user-guide/connect-to/ides/mssql_mcp.md rename to docs/en/documentation/connect-to/ides/mssql_mcp.md diff --git a/docs/en/user-guide/connect-to/ides/mysql_mcp.md b/docs/en/documentation/connect-to/ides/mysql_mcp.md similarity index 100% rename from docs/en/user-guide/connect-to/ides/mysql_mcp.md rename to docs/en/documentation/connect-to/ides/mysql_mcp.md diff --git a/docs/en/user-guide/connect-to/ides/neo4j_mcp.md b/docs/en/documentation/connect-to/ides/neo4j_mcp.md similarity index 100% rename from docs/en/user-guide/connect-to/ides/neo4j_mcp.md rename to docs/en/documentation/connect-to/ides/neo4j_mcp.md diff --git a/docs/en/user-guide/connect-to/ides/postgres_mcp.md b/docs/en/documentation/connect-to/ides/postgres_mcp.md similarity index 100% rename from docs/en/user-guide/connect-to/ides/postgres_mcp.md rename to docs/en/documentation/connect-to/ides/postgres_mcp.md diff --git a/docs/en/documentation/connect-to/ides/spanner_mcp.md b/docs/en/documentation/connect-to/ides/spanner_mcp.md new file mode 100644 index 000000000000..7f74f241d59d --- /dev/null +++ b/docs/en/documentation/connect-to/ides/spanner_mcp.md @@ -0,0 +1,22 @@ +--- +title: "Spanner using MCP" +type: docs +weight: 2 +description: > + Connect your IDE to Spanner using Toolbox. +manualLink: "https://cloud.google.com/spanner/docs/pre-built-tools-with-mcp-toolbox" +manualLinkTarget: _blank +--- + + + + Redirecting to Spanner using MCP + + + + +

Connecting to Spanner using MCP... If you are not automatically redirected, please + click here to proceed. +

+ + \ No newline at end of file diff --git a/docs/en/user-guide/connect-to/ides/sqlite_mcp.md b/docs/en/documentation/connect-to/ides/sqlite_mcp.md similarity index 100% rename from docs/en/user-guide/connect-to/ides/sqlite_mcp.md rename to docs/en/documentation/connect-to/ides/sqlite_mcp.md diff --git a/docs/en/user-guide/connect-to/mcp-client/_index.md b/docs/en/documentation/connect-to/mcp-client/_index.md similarity index 96% rename from docs/en/user-guide/connect-to/mcp-client/_index.md rename to docs/en/documentation/connect-to/mcp-client/_index.md index f3007c687d35..2d78bb84645a 100644 --- a/docs/en/user-guide/connect-to/mcp-client/_index.md +++ b/docs/en/documentation/connect-to/mcp-client/_index.md @@ -1,20 +1,20 @@ --- title: "MCP Client" type: docs -weight: 2 +weight: 1 description: > How to connect to Toolbox from a MCP Client. --- ## Toolbox SDKs vs Model Context Protocol (MCP) -Toolbox now supports connections via both the native Toolbox SDKs and via [Model +Toolbox supports connections via the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/). However, Toolbox has several features which are not supported in the MCP specification (such as Authenticated Parameters and Authorized invocation). -We recommend using the native SDKs over MCP clients to leverage these features. -The native SDKs can be combined with MCP clients in many cases. +We recommend using the native Toolbox Client SDKs over MCP clients to leverage these features. +The Toolbox SDKs can be combined with MCP clients in many cases. ### Protocol Versions diff --git a/docs/en/documentation/connect-to/toolbox-sdks/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/_index.md new file mode 100644 index 000000000000..5a21d8624908 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/_index.md @@ -0,0 +1,19 @@ +--- +title: "Toolbox SDKs" +type: docs +weight: 2 +description: > + Integrate the MCP Toolbox directly into your custom applications and AI agents using our official SDKs for Python, JavaScript/TypeScript, and Go. +--- + +Our Toolbox Client SDKs provide the foundational building blocks for connecting your custom applications to the MCP Toolbox server. + +Whether you are writing a simple script to execute a single query or building a complex, multi-agent orchestration system, these SDKs handle the underlying Model Context Protocol (MCP) communication so you can focus on your business logic. + +By using our SDKs, your application can dynamically request tools, bind parameters, add authentication, and execute commands at runtime. We offer official support and deep framework integrations across three primary languages: + +* **[Python](./python-sdk/_index.md)**: Includes the Core SDK, along with native integrations for popular orchestrators like LangChain, LlamaIndex, and the ADK. +* **[JavaScript / TypeScript](./javascript-sdk/_index.md)**: Includes the Node.js Core SDK and integrations for the Agent Development Kit (ADK). +* **[Go](./go-sdk/_index.md/)**: Includes the Core SDK, plus dedicated packages for building agents with Genkit (`tbgenkit`) and the ADK. + +Select your preferred language to explore installation instructions, quickstart guides, and framework-specific implementations. \ No newline at end of file diff --git a/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/_index.md new file mode 100644 index 000000000000..81a5de2dfd6d --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/_index.md @@ -0,0 +1,74 @@ +--- +title: "Go" +type: docs +weight: 3 +description: > + Go SDKs to connect to the MCP Toolbox server. +--- + +## Overview + +The MCP Toolbox service provides a centralized way to manage and expose tools +(like API connectors, database query tools, etc.) for use by GenAI applications. + +The Go SDK act as clients for that service. They handle the communication needed to: + +* Fetch tool definitions from your running Toolbox instance. +* Provide convenient Go structs representing those tools. +* Invoke the tools (calling the underlying APIs/services configured in Toolbox). +* Handle authentication and parameter binding as needed. + +By using the SDK, you can easily leverage your Toolbox-managed tools directly +within your Go applications or AI orchestration frameworks. + +## Which Package Should I Use? + +Choosing the right package depends on how you are building your application: + +- [**`core`**](core/): + This is a framework-agnostic way to connect tools to popular frameworks + like Google GenAI, LangChain, etc. + +- [**`tbadk`**](tbadk/): + This package provides a way to connect tools to ADK Go. + +- [**`tbgenkit`**](tbgenkit/): + This package provides functionality to convert the Tool fetched using the core package + into a Genkit Go compatible tool. + +## Available Packages + +This repository hosts the following Go packages. See the package-specific +README for detailed installation and usage instructions: + +| Package | Target Use Case | Integration | Path | Details (README) | +| :------ | :----------| :---------- | :---------------------- | :---------- | +| [`core`](core/) | Framework-agnostic / Custom applications | Use directly / Custom | `core/` | 📄 [View README](https://github.com/googleapis/mcp-toolbox-sdk-go/blob/main/core/README.md) | +| [`tbadk`](tbadk/) | ADK Go | Use directly | `tbadk/` | 📄 [View README](https://github.com/googleapis/mcp-toolbox-sdk-go/blob/main/tbadk/README.md) | +| [`tbgenkit`](tbgenkit/) | Genkit Go | Along with core | `tbgenkit/` | 📄 [View README](https://github.com/googleapis/mcp-toolbox-sdk-go/blob/main/tbgenkit/README.md) | + +## Getting Started + +To get started using Toolbox tools with an application, follow these general steps: + +1. **Set up and Run the Toolbox Service:** + + Before using the SDKs, you need the MCP Toolbox server running. Follow + the instructions here: [**Toolbox Getting Started + Guide**](https://github.com/googleapis/genai-toolbox?tab=readme-ov-file#getting-started) + +2. **Install the Appropriate SDK:** + + Choose the package based on your needs (see "[Which Package Should I Use?](#which-package-should-i-use)" above) + Use this command to install the SDK module + + ```bash + # For the core, framework-agnostic SDK + go get github.com/googleapis/mcp-toolbox-sdk-go + ``` + +{{< notice note >}} +Source code for [Go-sdk](https://github.com/googleapis/mcp-toolbox-sdk-go) +{{< /notice >}} + +## Explore the Go SDKs \ No newline at end of file diff --git a/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/core/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/core/_index.md new file mode 100644 index 000000000000..e597cffcc78c --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/core/_index.md @@ -0,0 +1,948 @@ +--- +title: "Core Package" +linkTitle: "Core" +type: docs +weight: 2 +description: > + MCP Toolbox Core SDK for integrating functionalities of MCP Toolbox into your Agentic apps. +--- + +## Overview + +The `core` package provides a Go interface to the MCP Toolbox service, enabling you to load and invoke tools from your own applications. + +## Installation + +```bash +go get github.com/googleapis/mcp-toolbox-sdk-go/core +``` +This SDK is supported on Go version 1.24.4 and higher. + +{{< notice note >}} +While the SDK itself is synchronous, you can execute its functions within goroutines to achieve asynchronous behavior. +{{< /notice >}} + +{{< notice note >}} +**Breaking Change Notice**: As of version `0.6.0`, this repository has transitioned to a multi-module structure. +* **For new versions (`v0.6.0`+)**: You must import specific modules (e.g., `go get github.com/googleapis/mcp-toolbox-sdk-go/core`). +* **For older versions (`v0.5.1` and below)**: The repository remains a single-module library (`go get github.com/googleapis/mcp-toolbox-sdk-go`). +* Please update your imports and `go.mod` accordingly when upgrading. +{{< /notice >}} + +## Quickstart + +Here's a minimal example to get you started. Ensure your Toolbox service is +running and accessible. + +```go +package main + +import ( + "context" + "fmt" + "github.com/googleapis/mcp-toolbox-sdk-go/core" +) + +func quickstart() string { + ctx := context.Background() + inputs := map[string]any{"location": "London"} + client, err := core.NewToolboxClient("http://localhost:5000") + if err != nil { + return fmt.Sprintln("Could not start Toolbox Client", err) + } + tool, err := client.LoadTool("get_weather", ctx) + if err != nil { + return fmt.Sprintln("Could not load Toolbox Tool", err) + } + result, err := tool.Invoke(ctx, inputs) + if err != nil { + return fmt.Sprintln("Could not invoke tool", err) + } + return fmt.Sprintln(result) +} + +func main() { + fmt.Println(quickstart()) +} +``` + +## Usage + +Import and initialize a Toolbox client, pointing it to the URL of your running +Toolbox service. + +```go +import "github.com/googleapis/mcp-toolbox-sdk-go/core" + +client, err := core.NewToolboxClient("http://localhost:5000") +``` + +All interactions for loading and invoking tools happen through this client. + +{{< notice note >}} +For advanced use cases, you can provide an external custom `http.Client` during initialization (e.g., `core.NewToolboxClient(URL, core.WithHTTPClient(myClient)`). +If you provide your own session, you are responsible for managing its lifecycle; `ToolboxClient` *will not* close it. +{{< /notice >}} + +{{< notice info >}} +Closing the `ToolboxClient` also closes the underlying network session shared by all tools loaded from that client. As a result, any tool instances you have loaded will cease to function and will raise an error if you attempt to invoke them after the client is closed. +{{< /notice >}} + +## Transport Protocols + +The SDK supports multiple transport protocols for communicating with the Toolbox server. By default, the client uses the latest supported version of the **Model Context Protocol (MCP)**. + +You can explicitly select a protocol using the `core.WithProtocol` option during client initialization. This is useful if you need to use the native Toolbox HTTP protocol or pin the client to a specific legacy version of MCP. + +{{< notice note >}} +* **Native Toolbox Transport**: This uses the service's native **REST over HTTP** API. +* **MCP Transports**: These options use the **Model Context Protocol over HTTP**. +{{< /notice >}} + +### Supported Protocols + +{{< notice note >}} +The native Toolbox protocol (`core.Toolbox`) is deprecated and will be removed on March 4, 2026. Please use `core.MCP` or specific MCP versions. +{{< /notice >}} + +| Constant | Description | +| :--- | :--- | +| `core.MCP` | **(Default)** Alias for the latest supported MCP version (currently `v2025-06-18`). | +| `core.Toolbox` | **Deprecated** The native Toolbox HTTP protocol. | +| `core.MCPv20251125` | MCP Protocol version 2025-11-25. | +| `core.MCPv20250618` | MCP Protocol version 2025-06-18. | +| `core.MCPv20250326` | MCP Protocol version 2025-03-26. | +| `core.MCPv20241105` | MCP Protocol version 2024-11-05. | + +### Example + +If you wish to use the native Toolbox protocol: + +```go +import "github.com/googleapis/mcp-toolbox-sdk-go/core" + +client, err := core.NewToolboxClient( + "http://localhost:5000", + core.WithProtocol(core.Toolbox), +) +``` +If you want to pin the MCP Version 2025-03-26: + +```go +import "github.com/googleapis/mcp-toolbox-sdk-go/core" + +client, err := core.NewToolboxClient( + "http://localhost:5000", + core.WithProtocol(core.MCPv20250326), +) +``` + +## Loading Tools + +You can load tools individually or in groups (toolsets) as defined in your +Toolbox service configuration. Loading a toolset is convenient when working with +multiple related functions, while loading a single tool offers more granular +control. + +### Load a toolset + +A toolset is a collection of related tools. You can load all tools in a toolset +or a specific one: + +```go +// Load default toolset by providing an empty string as the name +tools, err := client.LoadToolset("", ctx) + +// Load a specific toolset +tools, err := client.LoadToolset("my-toolset", ctx) +``` + + +### Load a single tool + +Loads a specific tool by its unique name. This provides fine-grained control. + +```go +tool, err = client.LoadTool("my-tool", ctx) +``` + +## Invoking Tools + +Once loaded, tools behave like Go structs. You invoke them using `Invoke` method +by passing arguments corresponding to the parameters defined in the tool's +configuration within the Toolbox service. + +```go +tool, err = client.LoadTool("my-tool", ctx) +inputs := map[string]any{"location": "London"} +result, err := tool.Invoke(ctx, inputs) +``` + +{{< notice tip >}} +For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../getting-started/local_quickstart_go.md). +{{< /notice >}} + +## Client to Server Authentication + +This section describes how to authenticate the ToolboxClient itself when +connecting to a Toolbox server instance that requires authentication. This is +crucial for securing your Toolbox server endpoint, especially when deployed on +platforms like Cloud Run, GKE, or any environment where unauthenticated access is restricted. + +This client-to-server authentication ensures that the Toolbox server can verify +the identity of the client making the request before any tool is loaded or +called. It is different from [Authenticating Tools](#authenticating-tools), +which deals with providing credentials for specific tools within an already +connected Toolbox session. + +### When is Client-to-Server Authentication Needed? + +You'll need this type of authentication if your Toolbox server is configured to +deny unauthenticated requests. For example: + +- Your Toolbox server is deployed on Cloud Run and configured to "Require authentication." +- Your server is behind an Identity-Aware Proxy (IAP) or a similar + authentication layer. +- You have custom authentication middleware on your self-hosted Toolbox server. + +Without proper client authentication in these scenarios, attempts to connect or +make calls (like `LoadTool`) will likely fail with `Unauthorized` errors. + +### How it works + +The `ToolboxClient` allows you to specify TokenSources that dynamically generate HTTP headers for +every request sent to the Toolbox server. The most common use case is to add an +Authorization header with a bearer token (e.g., a Google ID token). + +These header-generating functions are called just before each request, ensuring +that fresh credentials or header values can be used. + +### Configuration + +You can configure these dynamic headers as seen below: + + +```go +import "github.com/googleapis/mcp-toolbox-sdk-go/core" + +tokenProvider := func() string { + return "header3_value" +} + +staticTokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: "header2_value"}) +dynamicTokenSource := core.NewCustomTokenSource(tokenProvider) + +client, err := core.NewToolboxClient( + "toolbox-url", + core.WithClientHeaderString("header1", "header1_value"), + core.WithClientHeaderTokenSource("header2", staticTokenSource), + core.WithClientHeaderTokenSource("header3", dynamicTokenSource), +) +``` + +### Authenticating with Google Cloud Servers + +For Toolbox servers hosted on Google Cloud (e.g., Cloud Run) and requiring +`Google ID token` authentication, the helper module +[auth_methods](https://github.com/googleapis/mcp-toolbox-sdk-go/blob/main/core/auth.go) provides utility functions. + +### Step by Step Guide for Cloud Run + +1. **Configure Permissions**: [Grant](https://cloud.google.com/run/docs/securing/managing-access#service-add-principals) the `roles/run.invoker` IAM role on the Cloud + Run service to the principal. This could be your `user account email` or a + `service account`. +2. **Configure Credentials** + - Local Development: Set up + [ADC](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment). + - Google Cloud Environments: When running within Google Cloud (e.g., Compute + Engine, GKE, another Cloud Run service, Cloud Functions), ADC is typically + configured automatically, using the environment's default service account. +3. **Connect to the Toolbox Server** + ```go + import "github.com/googleapis/mcp-toolbox-sdk-go/core" + import "context" + + ctx := context.Background() + + token, err := core.GetGoogleIDToken(ctx, URL) + + client, err := core.NewToolboxClient( + URL, + core.WithClientHeaderString("Authorization", token), + ) + + // Now, you can use the client as usual. + ``` + +## Authenticating Tools + +{{< notice info >}} +**Always use HTTPS** to connect your application with the Toolbox service, especially in **production environments** or whenever the communication involves **sensitive data** (including scenarios where tools requireauthentication tokens). Using plain HTTP lacks encryption and exposes your application and data to significant security risks, such as eavesdropping and tampering. +{{< /notice >}} + +Tools can be configured within the Toolbox service to require authentication, +ensuring only authorized users or applications can invoke them, especially when +accessing sensitive data. + +### When is Authentication Needed? + +Authentication is configured per-tool within the Toolbox service itself. If a +tool you intend to use is marked as requiring authentication in the service, you +must configure the SDK client to provide the necessary credentials (currently +Oauth2 tokens) when invoking that specific tool. + +### Supported Authentication Mechanisms + +The Toolbox service enables secure tool usage through **Authenticated Parameters**. +For detailed information on how these mechanisms work within the Toolbox service and how to configure them, please refer to [Toolbox Service Documentation - Authenticated Parameters](../../../../configuration/tools/_index.md#authenticated-parameters). + +### Step 1: Configure Tools in Toolbox Service + +First, ensure the target tool(s) are configured correctly in the Toolbox service +to require authentication. Refer to the [Toolbox Service Documentation - +Authenticated +Parameters](../../../../configuration/tools/_index.md#authenticated-parameters) +for instructions. + +### Step 2: Configure SDK Client + +Your application needs a way to obtain the required Oauth2 token for the +authenticated user. The SDK requires you to provide a function capable of +retrieving this token *when the tool is invoked*. + +#### Provide an ID Token Retriever Function + +You must provide the SDK with a function that returns the +necessary token when called. The implementation depends on your application's +authentication flow (e.g., retrieving a stored token, initiating an OAuth flow). + +{{< notice info >}} +The name used when registering the getter function with the SDK (e.g., `"my_api_token"`) must exactly match the `name` of the corresponding `authServices` defined in the tool's configuration within the Toolbox service. +{{< /notice >}} + +```go +func getAuthToken() string { + // ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + // This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" // Placeholder +} +``` + +{{< notice tip >}} +Your token retriever function is invoked every time an authenticated parameter requires a token for a tool call. Consider implementing caching logic within this function to avoid redundant token fetching or generation, especially for tokens with longer validity periods or if the retrieval process is resource-intensive. +{{< /notice >}} + +#### Option A: Add Default Authentication to a Client + +You can add default tool level authentication to a client. +Every tool / toolset loaded by the client will contain the auth token. + +```go + +ctx := context.Background() + +client, err := core.NewToolboxClient("http://127.0.0.1:5000", + core.WithDefaultToolOptions( + core.WithAuthTokenString("my-auth-1", "auth-value"), + ), +) + +AuthTool, err := client.LoadTool("my-tool", ctx) +``` + +#### Option B: Add Authentication to a Loaded Tool + +You can add the token retriever function to a tool object *after* it has been +loaded. This modifies the specific tool instance. + +```go + +ctx := context.Background() + +client, err := core.NewToolboxClient("http://127.0.0.1:5000") + +tool, err := client.LoadTool("my-tool", ctx) + +AuthTool, err := tool.ToolFrom( + core.WithAuthTokenSource("my-auth", headerTokenSource), + core.WithAuthTokenString("my-auth-1", "value"), + ) +``` + +#### Option C: Add Authentication While Loading Tools + +You can provide the token retriever(s) directly during the `LoadTool` or +`LoadToolset` calls. This applies the authentication configuration only to the +tools loaded in that specific call, without modifying the original tool objects +if they were loaded previously. + +```go +AuthTool, err := client.LoadTool("my-tool", ctx, core.WithAuthTokenString("my-auth-1", "value")) + +// or + +AuthTools, err := client.LoadToolset( + "my-toolset", + ctx, + core.WithAuthTokenString("my-auth-1", "value"), +) +``` + +{{< notice note >}} +Adding auth tokens during loading only affect the tools loaded within that call. +{{< /notice >}} + +### Complete Authentication Example + +```go +import "github.com/googleapis/mcp-toolbox-sdk-go/core" +import "fmt" + +func getAuthToken() string { + // ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + // This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" // Placeholder +} + +func main() { + ctx := context.Background() + inputs := map[string]any{"input": "some input"} + + dynamicTokenSource := core.NewCustomTokenSource(getAuthToken) + + client, err := core.NewToolboxClient("http://127.0.0.1:5000") + tool, err := client.LoadTool("my-tool", ctx) + AuthTool, err := tool.ToolFrom(core.WithAuthTokenSource("my_auth", dynamicTokenSource)) + + result, err := AuthTool.Invoke(ctx, inputs) + + fmt.Println(result) +} +``` + +{{< notice note >}} +An auth token getter for a specific name (e.g., "GOOGLE_ID") will replace any client header with the same name followed by "_token" (e.g., "GOOGLE_ID_token"). +{{< /notice >}} + +## Binding Parameter Values + +The SDK allows you to pre-set, or "bind", values for specific tool parameters +before the tool is invoked or even passed to an LLM. These bound values are +fixed and will not be requested or modified by the LLM during tool use. + +### Why Bind Parameters? + +- **Protecting sensitive information:** API keys, secrets, etc. +- **Enforcing consistency:** Ensuring specific values for certain parameters. +- **Pre-filling known data:** Providing defaults or context. + +{{< notice info >}} +The parameter names used for binding (e.g., `"api_key"`) must exactly match the parameter names defined in the tool's configuration within the Toolbox service. +{{< /notice >}} + +{{< notice note >}} +You do not need to modify the tool's configuration in the Toolbox service to bind parameter values using the SDK. +{{< /notice >}} + +#### Option A: Add Default Bound Parameters to a Client + +You can add default tool level bound parameters to a client. Every tool / toolset +loaded by the client will have the bound parameter. + +```go + +ctx := context.Background() + +client, err := core.NewToolboxClient("http://127.0.0.1:5000", + core.WithDefaultToolOptions( + core.WithBindParamString("param1", "value"), + ), +) + +boundTool, err := client.LoadTool("my-tool", ctx) +``` + +### Option B: Binding Parameters to a Loaded Tool + +Bind values to a tool object *after* it has been loaded. This modifies the +specific tool instance. + +```go +client, err := core.NewToolboxClient("http://127.0.0.1:5000") + +tool, err := client.LoadTool("my-tool", ctx) + +boundTool, err := tool.ToolFrom( + core.WithBindParamString("param1", "value"), + core.WithBindParamString("param2", "value") + ) +``` + +### Option C: Binding Parameters While Loading Tools + +Specify bound parameters directly when loading tools. This applies the binding +only to the tools loaded in that specific call. + +```go +boundTool, err := client.LoadTool("my-tool", ctx, core.WithBindParamString("param", "value")) + +// OR + +boundTool, err := client.LoadToolset("", ctx, core.WithBindParamString("param", "value")) +``` + +{{< notice note >}} Bound values during loading only affect the tools loaded in that call. {{< /notice >}} + +### Binding Dynamic Values + +Instead of a static value, you can bind a parameter to a synchronous or +asynchronous function. This function will be called *each time* the tool is +invoked to dynamically determine the parameter's value at runtime. +Functions with the return type (data_type, error) can be provided. + +```go +getDynamicValue := func() (string, error) { return "req-123", nil } + +dynamicBoundTool, err := tool.ToolFrom(core.WithBindParamStringFunc("param", getDynamicValue)) +``` + +{{< notice info >}} You don't need to modify tool configurations to bind parameter values. {{< /notice >}} + +## Default Parameters + +Tools defined in the MCP Toolbox server can specify default values for their optional parameters. When invoking a tool using the SDK, if an input for a parameter with a default value is not provided, the SDK will automatically populate the request with the default value. + +```go +tool, err = client.LoadTool("my-tool", ctx) + +// If 'my-tool' has a parameter 'param2' with a default value of "default-value", +// we can omit 'param2' from the inputs. +inputs := map[string]any{"param1": "value"} + +// The invocation will automatically use param2="default-value" if not provided +result, err := tool.Invoke(ctx, inputs) +``` + + +# Using with Orchestration Frameworks + +To see how the MCP Toolbox Go SDK works with orchestration frameworks, check out these end-to-end examples given below. + +
+Google GenAI + +```go +// This sample demonstrates integration with the standard Google GenAI framework. +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "os" + + "github.com/googleapis/mcp-toolbox-sdk-go/core" + "google.golang.org/genai" +) + +// ConvertToGenaiTool translates a ToolboxTool into the genai.FunctionDeclaration format. +func ConvertToGenaiTool(toolboxTool *core.ToolboxTool) *genai.Tool { + + inputschema, err := toolboxTool.InputSchema() + if err != nil { + return &genai.Tool{} + } + + var schema *genai.Schema + _ = json.Unmarshal(inputschema, &schema) + // First, create the function declaration. + funcDeclaration := &genai.FunctionDeclaration{ + Name: toolboxTool.Name(), + Description: toolboxTool.Description(), + Parameters: schema, + } + + // Then, wrap the function declaration in a genai.Tool struct. + return &genai.Tool{ + FunctionDeclarations: []*genai.FunctionDeclaration{funcDeclaration}, + } +} + +// printResponse extracts and prints the relevant parts of the model's response. +func printResponse(resp *genai.GenerateContentResponse) { + for _, cand := range resp.Candidates { + if cand.Content != nil { + for _, part := range cand.Content.Parts { + fmt.Println(part.Text) + } + } + } +} + +func main() { + // Setup + ctx := context.Background() + apiKey := os.Getenv("GOOGLE_API_KEY") + toolboxURL := "http://localhost:5000" + + // Initialize the Google GenAI client using the explicit ClientConfig. + client, err := genai.NewClient(ctx, &genai.ClientConfig{ + APIKey: apiKey, + }) + if err != nil { + log.Fatalf("Failed to create Google GenAI client: %v", err) + } + + // Initialize the MCP Toolbox client. + toolboxClient, err := core.NewToolboxClient(toolboxURL) + if err != nil { + log.Fatalf("Failed to create Toolbox client: %v", err) + } + + // Load the tools using the MCP Toolbox SDK. + tools, err := toolboxClient.LoadToolset("my-toolset", ctx) + if err != nil { + log.Fatalf("Failed to load tools: %v\nMake sure your Toolbox server is running and the tool is configured.", err) + } + + genAITools := make([]*genai.Tool, len(tools)) + toolsMap := make(map[string]*core.ToolboxTool, len(tools)) + + for i, tool := range tools { + // Convert the tools into usable format + genAITools[i] = ConvertToGenaiTool(tool) + // Add tool to a map for lookup later + toolsMap[tool.Name()] = tool + } + + // Set up the generative model with the available tool. + modelName := "gemini-2.0-flash" + + query := "Find hotels in Basel with Basel in it's name and share the names with me" + + // Create the initial content prompt for the model. + contents := []*genai.Content{ + genai.NewContentFromText(query, genai.RoleUser), + } + config := &genai.GenerateContentConfig{ + Tools: genAITools, + ToolConfig: &genai.ToolConfig{ + FunctionCallingConfig: &genai.FunctionCallingConfig{ + Mode: genai.FunctionCallingConfigModeAny, + }, + }, + } + genContentResp, _ := client.Models.GenerateContent(ctx, modelName, contents, config) + + printResponse(genContentResp) + + functionCalls := genContentResp.FunctionCalls() + if len(functionCalls) == 0 { + log.Println("No function call returned by the AI. The model likely answered directly.") + return + } + + // Process the first function call (the example assumes one for simplicity). + fc := functionCalls[0] + log.Printf("--- Gemini requested function call: %s ---\n", fc.Name) + log.Printf("--- Arguments: %+v ---\n", fc.Args) + + var toolResultString string + + if fc.Name == "search-hotels-by-name" { + tool := toolsMap["search-hotels-by-name"] + toolResult, err := tool.Invoke(ctx, fc.Args) + toolResultString = fmt.Sprintf("%v", toolResult) + if err != nil { + log.Fatalf("Failed to execute tool '%s': %v", fc.Name, err) + } + + } else { + log.Println("LLM did not request our tool") + } + resultContents := []*genai.Content{ + genai.NewContentFromText("The tool returned this result, share it with the user based of their previous querys"+toolResultString, genai.RoleUser), + } + finalResponse, err := client.Models.GenerateContent(ctx, modelName, resultContents, &genai.GenerateContentConfig{}) + if err != nil { + log.Fatalf("Error calling GenerateContent (with function result): %v", err) + } + log.Println("=== Final Response from Model (after processing function result) ===") + printResponse(finalResponse) + +} +``` + +
+ +
+LangChain + +```go +// This sample demonstrates how to use Toolbox tools as function definitions in LangChain Go. +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "os" + + "github.com/googleapis/mcp-toolbox-sdk-go/core" + "github.com/tmc/langchaingo/llms" + "github.com/tmc/langchaingo/llms/googleai" +) + +// ConvertToLangchainTool converts a generic core.ToolboxTool into a LangChainGo llms.Tool. +func ConvertToLangchainTool(toolboxTool *core.ToolboxTool) llms.Tool { + + // Fetch the tool's input schema + inputschema, err := toolboxTool.InputSchema() + if err != nil { + return llms.Tool{} + } + + var paramsSchema map[string]any + _ = json.Unmarshal(inputschema, ¶msSchema) + + // Convert into LangChain's llms.Tool + return llms.Tool{ + Type: "function", + Function: &llms.FunctionDefinition{ + Name: toolboxTool.Name(), + Description: toolboxTool.Description(), + Parameters: paramsSchema, + }, + } +} + +func main() { + genaiKey := os.Getenv("GOOGLE_API_KEY") + toolboxURL := "http://localhost:5000" + ctx := context.Background() + + // Initialize the Google AI client (LLM). + llm, err := googleai.New(ctx, googleai.WithAPIKey(genaiKey), googleai.WithDefaultModel("gemini-1.5-flash")) + if err != nil { + log.Fatalf("Failed to create Google AI client: %v", err) + } + + // Initialize the MCP Toolbox client. + toolboxClient, err := core.NewToolboxClient(toolboxURL) + if err != nil { + log.Fatalf("Failed to create Toolbox client: %v", err) + } + + // Load the tools using the MCP Toolbox SDK. + tools, err := toolboxClient.LoadToolset("my-toolset", ctx) + if err != nil { + log.Fatalf("Failed to load tools: %v\nMake sure your Toolbox server is running and the tool is configured.", err) + } + + toolsMap := make(map[string]*core.ToolboxTool, len(tools)) + + langchainTools := make([]llms.Tool, len(tools)) + for i, tool := range tools { + // Convert the loaded ToolboxTools into the format LangChainGo requires. + langchainTools[i] = ConvertToLangchainTool(tool) + // Add tool to a map for lookup later + toolsMap[tool.Name()] = tool + } + + // Start the conversation history. + messageHistory := []llms.MessageContent{ + llms.TextParts(llms.ChatMessageTypeHuman, "Find hotels in Basel with Basel in it's name."), + } + + // Make the first call to the LLM, making it aware of the tool. + resp, err := llm.GenerateContent(ctx, messageHistory, llms.WithTools(langchainTools)) + if err != nil { + log.Fatalf("LLM call failed: %v", err) + } + + // Add the model's response (which should be a tool call) to the history. + respChoice := resp.Choices[0] + assistantResponse := llms.TextParts(llms.ChatMessageTypeAI, respChoice.Content) + for _, tc := range respChoice.ToolCalls { + assistantResponse.Parts = append(assistantResponse.Parts, tc) + } + messageHistory = append(messageHistory, assistantResponse) + + // Process each tool call requested by the model. + for _, tc := range respChoice.ToolCalls { + toolName := tc.FunctionCall.Name + + switch tc.FunctionCall.Name { + case "search-hotels-by-name": + var args map[string]any + if err := json.Unmarshal([]byte(tc.FunctionCall.Arguments), &args); err != nil { + log.Fatalf("Failed to unmarshal arguments for tool '%s': %v", toolName, err) + } + tool := toolsMap["search-hotels-by-name"] + toolResult, err := tool.Invoke(ctx, args) + if err != nil { + log.Fatalf("Failed to execute tool '%s': %v", toolName, err) + } + + // Create the tool call response message and add it to the history. + toolResponse := llms.MessageContent{ + Role: llms.ChatMessageTypeTool, + Parts: []llms.ContentPart{ + llms.ToolCallResponse{ + Name: toolName, + Content: fmt.Sprintf("%v", toolResult), + }, + }, + } + messageHistory = append(messageHistory, toolResponse) + default: + log.Fatalf("got unexpected function call: %v", tc.FunctionCall.Name) + } + } + + // Final LLM Call for Natural Language Response + log.Println("Sending tool response back to LLM for a final answer...") + + // Call the LLM again with the updated history, which now includes the tool's result. + finalResp, err := llm.GenerateContent(ctx, messageHistory) + if err != nil { + log.Fatalf("Final LLM call failed: %v", err) + } + + // Display the Result + fmt.Println("\n======================================") + fmt.Println("Final Response from LLM:") + fmt.Println(finalResp.Choices[0].Content) + fmt.Println("======================================") +} + +``` +
+ +
+OpenAI + +```go +// This sample demonstrates integration with the OpenAI Go client. +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + + "github.com/googleapis/mcp-toolbox-sdk-go/core" + openai "github.com/openai/openai-go" +) + +// ConvertToOpenAITool converts a ToolboxTool into the go-openai library's Tool format. +func ConvertToOpenAITool(toolboxTool *core.ToolboxTool) openai.ChatCompletionToolParam { + // Get the input schema + jsonSchemaBytes, err := toolboxTool.InputSchema() + if err != nil { + return openai.ChatCompletionToolParam{} + } + + // Unmarshal the JSON bytes into FunctionParameters + var paramsSchema openai.FunctionParameters + if err := json.Unmarshal(jsonSchemaBytes, ¶msSchema); err != nil { + return openai.ChatCompletionToolParam{} + } + + // Create and return the final tool parameter struct. + return openai.ChatCompletionToolParam{ + Function: openai.FunctionDefinitionParam{ + Name: toolboxTool.Name(), + Description: openai.String(toolboxTool.Description()), + Parameters: paramsSchema, + }, + } +} + +func main() { + // Setup + ctx := context.Background() + toolboxURL := "http://localhost:5000" + openAIClient := openai.NewClient() + + // Initialize the MCP Toolbox client. + toolboxClient, err := core.NewToolboxClient(toolboxURL) + if err != nil { + log.Fatalf("Failed to create Toolbox client: %v", err) + } + + // Load the tools using the MCP Toolbox SDK. + tools, err := toolboxClient.LoadToolset("my-toolset", ctx) + if err != nil { + log.Fatalf("Failed to load tool : %v\nMake sure your Toolbox server is running and the tool is configured.", err) + } + + openAITools := make([]openai.ChatCompletionToolParam, len(tools)) + toolsMap := make(map[string]*core.ToolboxTool, len(tools)) + + for i, tool := range tools { + // Convert the Toolbox tool into the openAI FunctionDeclaration format. + openAITools[i] = ConvertToOpenAITool(tool) + // Add tool to a map for lookup later + toolsMap[tool.Name()] = tool + + } + question := "Find hotels in Basel with Basel in it's name " + + params := openai.ChatCompletionNewParams{ + Messages: []openai.ChatCompletionMessageParamUnion{ + openai.UserMessage(question), + }, + Tools: openAITools, + Seed: openai.Int(0), + Model: openai.ChatModelGPT4o, + } + + // Make initial chat completion request + completion, err := openAIClient.Chat.Completions.New(ctx, params) + if err != nil { + panic(err) + } + + toolCalls := completion.Choices[0].Message.ToolCalls + + // Return early if there are no tool calls + if len(toolCalls) == 0 { + fmt.Printf("No function call") + return + } + +// If there was a function call, continue the conversation + params.Messages = append(params.Messages, completion.Choices[0].Message.ToParam()) + for _, toolCall := range toolCalls { + if toolCall.Function.Name == "search-hotels-by-name" { + // Extract the location from the function call arguments + var args map[string]interface{} + tool := toolsMap["search-hotels-by-name"] + err := json.Unmarshal([]byte(toolCall.Function.Arguments), &args) + if err != nil { + panic(err) + } + + result, err := tool.Invoke(ctx, args) + if err != nil { + log.Fatal("Could not invoke tool", err) + } + + params.Messages = append(params.Messages, openai.ToolMessage(result.(string), toolCall.ID)) + } + } + + completion, err = openAIClient.Chat.Completions.New(ctx, params) + if err != nil { + panic(err) + } + + fmt.Println(completion.Choices[0].Message.Content) +} +``` + +
diff --git a/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/_index.md new file mode 100644 index 000000000000..2946e261a8fa --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/_index.md @@ -0,0 +1,42 @@ +--- +title: "Go: Pre & Post Processing" +type: docs +weight: 4 +description: > + How to add pre- and post- processing to your Agents using Go. +sample_filters: ["Pre & Post Processing", "Go", "ADK"] +is_sample: true +--- + +## Prerequisites + +This tutorial assumes that you have set up MCP Toolbox with a basic agent as described in the [local quickstart](../../../../getting-started/local_quickstart_go.md). + +This guide demonstrates how to implement these patterns in your Toolbox applications. + +## Implementation + +{{< tabpane persist=header >}} +{{% tab header="ADK" text=true %}} +The following example demonstrates how to use the `beforeToolCallback` and `afterToolCallback` hooks in the ADK `LlmAgent` to implement pre and post processing logic. + +{{< include "go/adk/agent.go" "go" >}} + +You can also add model-level (`beforeModelCallback`, `afterModelCallback`) and agent-level (`beforeAgentCallback`, `afterAgentCallback`) hooks to intercept messages at different stages of the execution loop. + +For more information, see the [ADK Callbacks documentation](https://google.github.io/adk-docs/callbacks/types-of-callbacks/).{{% /tab %}} +{{< /tabpane >}} + +## Results + +The output should look similar to the following. + +{{< notice note >}} +The exact responses may vary due to the non-deterministic nature of LLMs and differences between orchestration frameworks. +{{< /notice >}} + +``` +AI: Booking Confirmed! You earned 500 Loyalty Points with this stay. + +AI: Error: Maximum stay duration is 14 days. +``` diff --git a/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/agent.go b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/agent.go new file mode 100644 index 000000000000..296e7397e4cb --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/agent.go @@ -0,0 +1,158 @@ +package main + +import ( + "context" + "fmt" + "log" + "os" + "strings" + "time" + + "github.com/googleapis/mcp-toolbox-sdk-go/tbadk" + "google.golang.org/adk/agent" + "google.golang.org/adk/agent/llmagent" + "google.golang.org/adk/model/gemini" + "google.golang.org/adk/runner" + "google.golang.org/adk/session" + "google.golang.org/adk/tool" + "google.golang.org/genai" +) + +const systemPrompt = `You're a helpful hotel assistant. You handle hotel searching, booking and +cancellations. When the user searches for a hotel, mention it's name, id, +location and price tier. Always mention hotel ids while performing any +searches. This is very important for any operations. For any bookings or +cancellations, please provide the appropriate confirmation. Be sure to +update checkin or checkout dates if mentioned by the user. +Don't ask for confirmations from the user.` + +var queries = []string{ + "Book hotel with id 3.", + "Update my hotel with id 3 with checkin date 2025-01-04 and checkout date 2025-01-20", +} + +// Pre-processing +func enforceBusinessRules(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { + + fmt.Printf("POLICY CHECK: Intercepting '%s'\n", tool.Name()) + if tool.Name() == "update-hotel" { + checkinStr, okCheckin := args["checkin_date"].(string) + checkoutStr, okCheckout := args["checkout_date"].(string) + + if okCheckin && okCheckout { + startDate, errStart := time.Parse("2006-01-02", checkinStr) + endDate, errEnd := time.Parse("2006-01-02", checkoutStr) + if errStart != nil || errEnd != nil { + return nil, nil + } + + duration := endDate.Sub(startDate).Hours() / 24 + if duration > 14 { + fmt.Println("BLOCKED: Stay too long") + return map[string]any{"Error": "Maximum stay duration is 14 days."}, nil + } + } + } + return nil, nil +} + +// Post-processing +func enrichResponse(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { + resultStr := fmt.Sprintf("%v", result) + + if tool.Name() == "book-hotel" { + if err != nil { + return nil, err + } + if _, ok := result["Error"]; !ok && !strings.Contains(resultStr, "Error") { + const loyaltyBonus = 500 + enrichedResult := fmt.Sprintf("Booking Confirmed!\n You earned %d Loyalty Points with this stay.\n\nSystem Details: %s", loyaltyBonus, resultStr) + return map[string]any{"confirmation": enrichedResult}, nil + } + } + return result, nil +} + +func main() { + genaiKey := os.Getenv("GOOGLE_API_KEY") + toolboxURL := "http://localhost:5000" + ctx := context.Background() + + toolboxClient, err := tbadk.NewToolboxClient(toolboxURL) + if err != nil { + log.Fatalf("Failed to create MCP Toolbox client: %v", err) + } + + toolsetName := "my-toolset" + mcpTools, err := toolboxClient.LoadToolset(toolsetName, ctx) + if err != nil { + log.Fatalf("Failed to load MCP toolset '%s': %v\nMake sure your Toolbox server is running.", toolsetName, err) + } + + model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ + APIKey: genaiKey, + }) + if err != nil { + log.Fatalf("Failed to create model: %v", err) + } + + tools := make([]tool.Tool, len(mcpTools)) + for i := range mcpTools { + tools[i] = &mcpTools[i] + } + llmagent, err := llmagent.New(llmagent.Config{ + Name: "hotel_assistant", + Model: model, + Description: "Agent to answer questions about hotels.", + Instruction: systemPrompt, + Tools: tools, + // Add pre- and post- processing hooks + BeforeToolCallbacks: []llmagent.BeforeToolCallback{enforceBusinessRules}, + AfterToolCallbacks: []llmagent.AfterToolCallback{enrichResponse}, + }) + if err != nil { + log.Fatalf("Failed to create agent: %v", err) + } + + appName := "hotel_assistant" + userID := "user-123" + sessionService := session.InMemoryService() + respSess, err := sessionService.Create(ctx, &session.CreateRequest{ + AppName: appName, + UserID: userID, + }) + if err != nil { + log.Fatalf("Failed to create the session service: %v", err) + } + sess := respSess.Session + + r, err := runner.New(runner.Config{ + AppName: appName, + Agent: llmagent, + SessionService: sessionService, + }) + if err != nil { + log.Fatalf("Failed to create runner: %v", err) + } + + for i, query := range queries { + fmt.Printf("\n=== Query %d: %s ===\n", i+1, query) + userMsg := genai.NewContentFromText(query, genai.RoleUser) + streamingMode := agent.StreamingModeSSE + + runIter := r.Run(ctx, userID, sess.ID(), userMsg, agent.RunConfig{ + StreamingMode: streamingMode, + }) + + fmt.Print("AI: ") + for event := range runIter { + if event != nil && event.Content != nil { + for _, p := range event.Content.Parts { + fmt.Print(p.Text) + } + } + } + + fmt.Println("\n" + strings.Repeat("-", 80) + "\n") + } +} diff --git a/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/go.mod b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/go.mod new file mode 100644 index 000000000000..3de9bc4d7ad3 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/go.mod @@ -0,0 +1,44 @@ +module example.com/adk-agent + +go 1.24.4 + +require ( + github.com/googleapis/mcp-toolbox-sdk-go v0.5.1 + google.golang.org/adk v0.3.0 + google.golang.org/genai v1.43.0 +) + +require ( + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.18.1 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/google/safehtml v0.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.11 // indirect + github.com/googleapis/gax-go/v2 v2.16.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect + go.opentelemetry.io/otel v1.39.0 // indirect + go.opentelemetry.io/otel/metric v1.39.0 // indirect + go.opentelemetry.io/otel/sdk v1.39.0 // indirect + go.opentelemetry.io/otel/trace v1.39.0 // indirect + golang.org/x/crypto v0.47.0 // indirect + golang.org/x/net v0.49.0 // indirect + golang.org/x/oauth2 v0.34.0 // indirect + golang.org/x/sys v0.40.0 // indirect + golang.org/x/text v0.33.0 // indirect + google.golang.org/api v0.263.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d // indirect + google.golang.org/grpc v1.78.0 // indirect + google.golang.org/protobuf v1.36.11 // indirect + rsc.io/omap v1.2.0 // indirect + rsc.io/ordered v1.1.1 // indirect +) diff --git a/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/go.sum b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/go.sum new file mode 100644 index 000000000000..3a9efd896556 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/adk/go.sum @@ -0,0 +1,132 @@ +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.18.1 h1:IwTEx92GFUo2pJ6Qea0EU3zYvKnTAeRCODxfA/G5UWs= +cloud.google.com/go/auth v0.18.1/go.mod h1:GfTYoS9G3CWpRA3Va9doKN9mjPGRS+v41jmZAhBzbrA= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= +cloud.google.com/go/secretmanager v1.16.0 h1:19QT7ZsLJ8FSP1k+4esQvuCD7npMJml6hYzilxVyT+k= +cloud.google.com/go/secretmanager v1.16.0/go.mod h1://C/e4I8D26SDTz1f3TQcddhcmiC3rMEl0S1Cakvs3Q= +cloud.google.com/go/storage v1.59.2 h1:gmOAuG1opU8YvycMNpP+DvHfT9BfzzK5Cy+arP+Nocw= +cloud.google.com/go/storage v1.59.2/go.mod h1:cMWbtM+anpC74gn6qjLh+exqYcfmB9Hqe5z6adx+CLI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 h1:lhhYARPUu3LmHysQ/igznQphfzynnqI3D75oUyw1HXk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0/go.mod h1:l9rva3ApbBpEJxSNYnwT9N4CDLrWgtq3u8736C5hyJw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 h1:s0WlVbf9qpvkh1c/uDAPElam0WrL7fHRIidgZJ7UqZI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= +github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1:K+fnvUM0VZ7ZFJf0n4L/BRlnsb9pL/GuDG6FqaH+PwM= +github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo= +github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/jsonschema-go v0.3.0 h1:6AH2TxVNtk3IlvkkhjrtbUc4S8AvO0Xii0DxIygDg+Q= +github.com/google/jsonschema-go v0.3.0/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/safehtml v0.1.0 h1:EwLKo8qawTKfsi0orxcQAZzu07cICaBeFMegAU9eaT8= +github.com/google/safehtml v0.1.0/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.11 h1:vAe81Msw+8tKUxi2Dqh/NZMz7475yUvmRIkXr4oN2ao= +github.com/googleapis/enterprise-certificate-proxy v0.3.11/go.mod h1:RFV7MUdlb7AgEq2v7FmMCfeSMCllAzWxFgRdusoGks8= +github.com/googleapis/gax-go/v2 v2.16.0 h1:iHbQmKLLZrexmb0OSsNGTeSTS0HO4YvFOG8g5E4Zd0Y= +github.com/googleapis/gax-go/v2 v2.16.0/go.mod h1:o1vfQjjNZn4+dPnRdl/4ZD7S9414Y4xA+a/6Icj6l14= +github.com/googleapis/mcp-toolbox-sdk-go v0.5.1 h1:Jc7IUlVoitpkWK+21ccmzg+213Nv9lyN0tHXv16JPsQ= +github.com/googleapis/mcp-toolbox-sdk-go v0.5.1/go.mod h1:wjOHkYUVD8TwLcAaSbubKj6kY8pfMVCEIxy2OzL4Fu0= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY6LiIY9I8cUfm+pJs= +go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= +go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= +go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= +golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/adk v0.3.0 h1:gitgAKnET1F1+fFZc7VSAEo7cjK+D39mnRyqIRTzyzY= +google.golang.org/adk v0.3.0/go.mod h1:iE1Kgc8JtYHiNxfdLa9dxcV4DqTn0D8q4eqhBi012Ak= +google.golang.org/api v0.263.0 h1:UFs7qn8gInIdtk1ZA6eXRXp5JDAnS4x9VRsRVCeKdbk= +google.golang.org/api v0.263.0/go.mod h1:fAU1xtNNisHgOF5JooAs8rRaTkl2rT3uaoNGo9NS3R8= +google.golang.org/genai v1.43.0 h1:8vhqhzJNZu1U94e2m+KvDq/TUUjSmDrs1aKkvTa8SoM= +google.golang.org/genai v1.43.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217 h1:GvESR9BIyHUahIb0NcTum6itIWtdoglGX+rnGxm2934= +google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:yJ2HH4EHEDTd3JiLmhds6NkJ17ITVYOdV3m3VKOnws0= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d h1:xXzuihhT3gL/ntduUZwHECzAn57E8dA6l8SOtYWdD8Q= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/omap v1.2.0 h1:c1M8jchnHbzmJALzGLclfH3xDWXrPxSUHXzH5C+8Kdw= +rsc.io/omap v1.2.0/go.mod h1:C8pkI0AWexHopQtZX+qiUeJGzvc8HkdgnsWK4/mAa00= +rsc.io/ordered v1.1.1 h1:1kZM6RkTmceJgsFH/8DLQvkCVEYomVDJfBRLT595Uak= +rsc.io/ordered v1.1.1/go.mod h1:evAi8739bWVBRG9aaufsjVc202+6okf8u2QeVL84BCM= diff --git a/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/agent_test.go b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/agent_test.go new file mode 100644 index 000000000000..d8bf3ab7a6a0 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/pre-post-processing/agent_test.go @@ -0,0 +1,78 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "bytes" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" +) + +func TestQuickstartSample(t *testing.T) { + framework := os.Getenv("ORCH_NAME") + if framework == "" { + t.Skip("Skipping test: ORCH_NAME environment variable is not set.") + } + + t.Logf("--- Testing: %s ---", framework) + + if os.Getenv("GOOGLE_API_KEY") == "" { + t.Skipf("Skipping test for %s: GOOGLE_API_KEY environment variable is not set.", framework) + } + + sampleDir := filepath.Join(".", framework) + if _, err := os.Stat(sampleDir); os.IsNotExist(err) { + t.Fatalf("Test setup failed: directory for framework '%s' not found.", framework) + } + + cmd := exec.Command("go", "run", ".") + cmd.Dir = sampleDir + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + err := cmd.Run() + actualOutput := stdout.String() + + if err != nil { + t.Fatalf("Script execution failed with error: %v\n--- STDERR ---\n%s", err, stderr.String()) + } + if len(actualOutput) == 0 { + t.Fatal("Script ran successfully but produced no output.") + } + + goldenKeywords := []string{ + "AI:", + "Loyalty Points", + "POLICY CHECK: Intercepting 'update-hotel'", + } + + var missingKeywords []string + outputLower := strings.ToLower(actualOutput) + + for _, keyword := range goldenKeywords { + kw := strings.TrimSpace(keyword) + if kw != "" && !strings.Contains(outputLower, strings.ToLower(kw)) { + missingKeywords = append(missingKeywords, kw) + } + } + + if len(missingKeywords) > 0 { + t.Fatalf("FAIL: The following keywords were missing from the output: [%s]", strings.Join(missingKeywords, ", ")) + } +} diff --git a/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/tbadk/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/tbadk/_index.md new file mode 100644 index 000000000000..cd6961dcb46b --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/tbadk/_index.md @@ -0,0 +1,699 @@ +--- +title: "ADK Package" +linkTitle: "ADK" +type: docs +weight: 1 +description: > + MCP Toolbox ADK for integrating functionalities of MCP Toolbox into your Agentic apps. +--- + +## Overview + +The `tbadk` package provides a Go interface to the MCP Toolbox service, enabling you to load and invoke tools from your own applications. + +## Installation + +```bash +go get github.com/googleapis/mcp-toolbox-sdk-go/tbadk +``` +This SDK is supported on Go version 1.24.4 and higher. + +{{< notice note >}} +While the SDK itself is synchronous, you can execute its functions within goroutines to achieve asynchronous behavior. +{{< /notice >}} + +{{< notice note >}} +**Breaking Change Notice**: As of version `0.6.0`, this repository has transitioned to a multi-module structure. +* **For new versions (`v0.6.0`+)**: You must import specific modules (e.g., `go get github.com/googleapis/mcp-toolbox-sdk-go/tbadk`). +* **For older versions (`v0.5.1` and below)**: The repository remains a single-module library (`go get github.com/googleapis/mcp-toolbox-sdk-go`). +* Please update your imports and `go.mod` accordingly when upgrading. +{{< /notice >}} + +## Quickstart + +Here's a minimal example to get you started. Ensure your Toolbox service is +running and accessible. + +```go +package main + +import ( + "context" + "fmt" + "github.com/googleapis/mcp-toolbox-sdk-go/tbadk" +) + +func quickstart() string { + inputs := map[string]any{"location": "London"} + client, err := tbadk.NewToolboxClient("http://localhost:5000") + if err != nil { + return fmt.Sprintln("Could not start Toolbox Client", err) + } + tool, err := client.LoadTool("get_weather", ctx) + if err != nil { + return fmt.Sprintln("Could not load Toolbox Tool", err) + } + // pass the tool.Context as ctx into the Run() method + result, err := tool.Run(ctx, inputs) + if err != nil { + return fmt.Sprintln("Could not invoke tool", err) + } + return fmt.Sprintln(result["output"]) +} + +func main() { + fmt.Println(quickstart()) +} +``` + +## Usage + +Import and initialize a Toolbox client, pointing it to the URL of your running +Toolbox service. + +```go +import "github.com/googleapis/mcp-toolbox-sdk-go/tbadk" + +client, err := tbadk.NewToolboxClient("http://localhost:5000") +``` + +All interactions for loading and invoking tools happen through this client. + +{{< notice note >}} +For advanced use cases, you can provide an external custom `http.Client` +during initialization (e.g., `tbadk.NewToolboxClient(URL, core.WithHTTPClient(myClient)`). If you provide your own session, you are responsible for managing its lifecycle; +`ToolboxClient` *will not* close it. +{{< /notice >}} + +## Transport Protocols + +The SDK supports multiple transport protocols. By default, the client uses the latest supported version of the **Model Context Protocol (MCP)**. + +You can explicitly select a protocol using the `core.WithProtocol` option during client initialization. + +{{< notice note >}} +* **Native Toolbox Transport**: This uses the service's native **REST over HTTP** API. +* **MCP Transports**: These options use the **Model Context Protocol over HTTP**. +{{< /notice >}} + +### Supported Protocols + +{{< notice note >}} +The native Toolbox protocol (`core.Toolbox`) is deprecated and will be removed on March 4, 2026. Please use `core.MCP` or specific MCP versions. +{{< /notice >}} + +| Constant | Description | +| :--- | :--- | +| `core.MCP` | **(Default)** Alias for the latest supported MCP version (currently `v2025-06-18`). | +| `core.Toolbox` | **Deprecated** The native Toolbox HTTP protocol. | +| `core.MCPv20251125` | MCP Protocol version 2025-11-25. | +| `core.MCPv20250618` | MCP Protocol version 2025-06-18. | +| `core.MCPv20250326` | MCP Protocol version 2025-03-26. | +| `core.MCPv20241105` | MCP Protocol version 2024-11-05. | + +### Example + +```go +import ( + "github.com/googleapis/mcp-toolbox-sdk-go/core" + "github.com/googleapis/mcp-toolbox-sdk-go/tbadk" +) + +// Initialize with the native Toolbox protocol +client, err := tbadk.NewToolboxClient( + "http://localhost:5000", + core.WithProtocol(core.Toolbox), +) + +// Initialize with the MCP Protocol 2025-03-26 +client, err := tbadk.NewToolboxClient( + "http://localhost:5000", + core.WithProtocol(core.MCPv20250326), +) + +``` + +## Loading Tools + +You can load tools individually or in groups (toolsets) as defined in your +Toolbox service configuration. Loading a toolset is convenient when working with +multiple related functions, while loading a single tool offers more granular +control. + +### Load a toolset + +A toolset is a collection of related tools. You can load all tools in a toolset +or a specific one: + +```go +// Load default toolset by providing an empty string as the name +tools, err := client.LoadToolset("", ctx) + +// Load a specific toolset +tools, err := client.LoadToolset("my-toolset", ctx) +``` + +`LoadToolset` returns a slice of the ToolboxTool structs (`[]ToolboxTool`). + + +### Load a single tool + +Loads a specific tool by its unique name. This provides fine-grained control. + +```go +tool, err = client.LoadTool("my-tool", ctx) +``` + +## Invoking Tools + +Once loaded, tools behave like Go structs. You invoke them using `Run` method +by passing arguments corresponding to the parameters defined in the tool's +configuration within the Toolbox service. + +```go +tool, err = client.LoadTool("my-tool", ctx) +inputs := map[string]any{"location": "London"} +// Pass the tool.Context as ctx to the Run() function +result, err := tool.Run(ctx, inputs) +``` + +{{< notice tip >}}For a more comprehensive guide on setting up the Toolbox service itself, which +you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../getting-started/local_quickstart_go.md). +{{< /notice >}} + +## Client to Server Authentication + +This section describes how to authenticate the ToolboxClient itself when +connecting to a Toolbox server instance that requires authentication. This is +crucial for securing your Toolbox server endpoint, especially when deployed on +platforms like Cloud Run, GKE, or any environment where unauthenticated access is restricted. + +This client-to-server authentication ensures that the Toolbox server can verify +the identity of the client making the request before any tool is loaded or +called. It is different from [Authenticating Tools](#authenticating-tools), +which deals with providing credentials for specific tools within an already +connected Toolbox session. + +### When is Client-to-Server Authentication Needed? + +You'll need this type of authentication if your Toolbox server is configured to +deny unauthenticated requests. For example: + +- Your Toolbox server is deployed on Cloud Run and configured to "Require authentication." +- Your server is behind an Identity-Aware Proxy (IAP) or a similar + authentication layer. +- You have custom authentication middleware on your self-hosted Toolbox server. + +Without proper client authentication in these scenarios, attempts to connect or +make calls (like `LoadTool`) will likely fail with `Unauthorized` errors. + +### How it works + +The `ToolboxClient` allows you to specify TokenSources that dynamically generate HTTP headers for +every request sent to the Toolbox server. The most common use case is to add an +Authorization header with a bearer token (e.g., a Google ID token). + +These header-generating functions are called just before each request, ensuring +that fresh credentials or header values can be used. + +### Configuration + +You can configure these dynamic headers as seen below: + + +```go +import ( + "github.com/googleapis/mcp-toolbox-sdk-go/core" + "github.com/googleapis/mcp-toolbox-sdk-go/tbadk" +) + +tokenProvider := func() string { + return "header3_value" +} + +staticTokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: "header2_value"}) +dynamicTokenSource := core.NewCustomTokenSource(tokenProvider) + +client, err := tbadk.NewToolboxClient( + "toolbox-url", + core.WithClientHeaderString("header1", "header1_value"), + core.WithClientHeaderTokenSource("header2", staticTokenSource), + core.WithClientHeaderTokenSource("header3", dynamicTokenSource), +) +``` + +### Authenticating with Google Cloud Servers + +For Toolbox servers hosted on Google Cloud (e.g., Cloud Run) and requiring +`Google ID token` authentication, the helper module +[auth_methods](../core/_index.md#authenticating-with-google-cloud-servers) provides utility functions. + +### Step by Step Guide for Cloud Run + +1. **Configure Permissions**: [Grant](https://cloud.google.com/run/docs/securing/managing-access#service-add-principals) the `roles/run.Runr` IAM role on the Cloud + Run service to the principal. This could be your `user account email` or a + `service account`. +2. **Configure Credentials** + - Local Development: Set up + [ADC](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment). + - Google Cloud Environments: When running within Google Cloud (e.g., Compute + Engine, GKE, another Cloud Run service, Cloud Functions), ADC is typically + configured automatically, using the environment's default service account. +3. **Connect to the Toolbox Server** + ```go + import ( + "github.com/googleapis/mcp-toolbox-sdk-go/core" + "github.com/googleapis/mcp-toolbox-sdk-go/tbadk" + "context" + ) + + ctx := context.Background() + + token, err := core.GetGoogleIDToken(ctx, URL) + + client, err := tbadk.NewToolboxClient( + URL, + core.WithClientHeaderString("Authorization", token), + ) + + // Now, you can use the client as usual. + ``` + +## Authenticating Tools + +{{< notice warning >}} **Always use HTTPS** to connect your application with the Toolbox service, +especially in **production environments** or whenever the communication +involves **sensitive data** (including scenarios where tools require +authentication tokens). Using plain HTTP lacks encryption and exposes your +application and data to significant security risks, such as eavesdropping and tampering. +{{< /notice >}} + +Tools can be configured within the Toolbox service to require authentication, +ensuring only authorized users or applications can invoke them, especially when +accessing sensitive data. + +### When is Authentication Needed? + +Authentication is configured per-tool within the Toolbox service itself. If a +tool you intend to use is marked as requiring authentication in the service, you +must configure the SDK client to provide the necessary credentials (currently +Oauth2 tokens) when invoking that specific tool. + +### Supported Authentication Mechanisms + +The Toolbox service enables secure tool usage through **Authenticated Parameters**. +For detailed information on how these mechanisms work within the Toolbox service and how to configure them, please refer to [Toolbox Service Documentation - Authenticated Parameters](../../../../configuration/tools/_index.md#authenticated-parameters). + +### Step 1: Configure Tools in Toolbox Service + +First, ensure the target tool(s) are configured correctly in the Toolbox service +to require authentication. Refer to the [Toolbox Service Documentation - +Authenticated +Parameters](../../../../configuration/tools/_index.md#authenticated-parameters) +for instructions. + +### Step 2: Configure SDK Client + +Your application needs a way to obtain the required Oauth2 token for the +authenticated user. The SDK requires you to provide a function capable of +retrieving this token *when the tool is invoked*. + +#### Provide an ID Token Retriever Function + +You must provide the SDK with a function that returns the +necessary token when called. The implementation depends on your application's +authentication flow (e.g., retrieving a stored token, initiating an OAuth flow). + +{{< notice info >}} +The name used when registering the getter function with the SDK (e.g., +`"my_api_token"`) must exactly match the `name` of the corresponding +`authServices` defined in the tool's configuration within the Toolbox service. +{{< /notice >}} + +```go +func getAuthToken() string { + // ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + // This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" // Placeholder +} +``` + +{{< notice tip >}} Your token retriever function is invoked every time an authenticated parameter +requires a token for a tool call. Consider implementing caching logic within +this function to avoid redundant token fetching or generation, especially for +tokens with longer validity periods or if the retrieval process is resource-intensive. +{{< /notice >}} + +#### Option A: Add Default Authentication to a Client + +You can add default tool level authentication to a client. +Every tool / toolset loaded by the client will contain the auth token. + +```go + +ctx := context.Background() + +client, err := tbadk.NewToolboxClient("http://127.0.0.1:5000", + core.WithDefaultToolOptions( + core.WithAuthTokenString("my-auth-1", "auth-value"), + ), +) + +AuthTool, err := client.LoadTool("my-tool", ctx) +``` + +#### Option B: Add Authentication to a Loaded Tool + +You can add the token retriever function to a tool object *after* it has been +loaded. This modifies the specific tool instance. + +```go + +ctx := context.Background() + +client, err := tbadk.NewToolboxClient("http://127.0.0.1:5000") + +tool, err := client.LoadTool("my-tool", ctx) + +AuthTool, err := tool.ToolFrom( + core.WithAuthTokenSource("my-auth", headerTokenSource), + core.WithAuthTokenString("my-auth-1", "value"), + ) +``` + +#### Option C: Add Authentication While Loading Tools + +You can provide the token retriever(s) directly during the `LoadTool` or +`LoadToolset` calls. This applies the authentication configuration only to the +tools loaded in that specific call, without modifying the original tool objects +if they were loaded previously. + +```go +AuthTool, err := client.LoadTool("my-tool", ctx, core.WithAuthTokenString("my-auth-1", "value")) + +// or + +AuthTools, err := client.LoadToolset( + "my-toolset", + ctx, + core.WithAuthTokenString("my-auth-1", "value"), +) +``` + +{{< notice note >}} +Adding auth tokens during loading only affect the tools loaded within that call. +{{< /notice >}} + +### Complete Authentication Example + +```go +import "github.com/googleapis/mcp-toolbox-sdk-go/core" +import "fmt" + +func getAuthToken() string { + // ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + // This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" // Placeholder +} + +func main() { + ctx := context.Background() + inputs := map[string]any{"input": "some input"} + + dynamicTokenSource := core.NewCustomTokenSource(getAuthToken) + + client, err := tbadk.NewToolboxClient("http://127.0.0.1:5000") + tool, err := client.LoadTool("my-tool", ctx) + AuthTool, err := tool.ToolFrom(core.WithAuthTokenSource("my_auth", dynamicTokenSource)) + + result, err := AuthTool.Run(ctx, inputs) + + fmt.Println(result) +} +``` + +{{< notice note >}}An auth token getter for a specific name (e.g., "GOOGLE_ID") will replace any client header with the same name followed by "_token" (e.g.,"GOOGLE_ID_token"). +{{< /notice >}} + +## Binding Parameter Values + +The SDK allows you to pre-set, or "bind", values for specific tool parameters +before the tool is invoked or even passed to an LLM. These bound values are +fixed and will not be requested or modified by the LLM during tool use. + +### Why Bind Parameters? + +- **Protecting sensitive information:** API keys, secrets, etc. +- **Enforcing consistency:** Ensuring specific values for certain parameters. +- **Pre-filling known data:** Providing defaults or context. + +{{< notice info >}} +The parameter names used for binding (e.g., `"api_key"`) must exactly match the +parameter names defined in the tool's configuration within the Toolbox service. +{{< /notice >}} + +{{< notice note >}} +You do not need to modify the tool's configuration in the Toolbox service to bind parameter values using the SDK. +{{< /notice >}} + +#### Option A: Add Default Bound Parameters to a Client + +You can add default tool level bound parameters to a client. Every tool / toolset +loaded by the client will have the bound parameter. + +```go + +ctx := context.Background() + +client, err := tbadk.NewToolboxClient("http://127.0.0.1:5000", + core.WithDefaultToolOptions( + core.WithBindParamString("param1", "value"), + ), +) + +boundTool, err := client.LoadTool("my-tool", ctx) +``` + +### Option B: Binding Parameters to a Loaded Tool + +Bind values to a tool object *after* it has been loaded. This modifies the +specific tool instance. + +```go +client, err := tbadk.NewToolboxClient("http://127.0.0.1:5000") + +tool, err := client.LoadTool("my-tool", ctx) + +boundTool, err := tool.ToolFrom( + core.WithBindParamString("param1", "value"), + core.WithBindParamString("param2", "value") + ) +``` + +### Option C: Binding Parameters While Loading Tools + +Specify bound parameters directly when loading tools. This applies the binding +only to the tools loaded in that specific call. + +```go +boundTool, err := client.LoadTool("my-tool", ctx, core.WithBindParamString("param", "value")) + +// OR + +boundTool, err := client.LoadToolset("", ctx, core.WithBindParamString("param", "value")) +``` + +{{< notice note >}} +Bound values during loading only affect the tools loaded in that call. +{{< /notice >}} + +### Binding Dynamic Values + +Instead of a static value, you can bind a parameter to a synchronous or +asynchronous function. This function will be called *each time* the tool is +invoked to dynamically determine the parameter's value at runtime. +Functions with the return type (data_type, error) can be provided. + +```go +getDynamicValue := func() (string, error) { return "req-123", nil } + +dynamicBoundTool, err := tool.ToolFrom(core.WithBindParamStringFunc("param", getDynamicValue)) +``` + +{{< notice info >}} +You don't need to modify tool configurations to bind parameter values. +{{< /notice >}} + +## Default Parameters + +Tools defined in the MCP Toolbox server can specify default values for their optional parameters. When invoking a tool using the SDK, if an input for a parameter with a default value is not provided, the SDK will automatically populate the request with the default value. + +```go +tool, err = client.LoadTool("my-tool", ctx) + +// If 'my-tool' has a parameter 'param2' with a default value of "default-value", +// we can omit 'param2' from the inputs. +inputs := map[string]any{"param1": "value"} + +// The invocation will automatically use param2="default-value" if not provided +result, err := tool.Run(ctx, inputs) +``` + +## Using with ADK Go + +After altering the tool to your needs, type-assert the ToolboxTool and pass it to the LLM agent. + +### For a single tool + +```go + +toolboxtool, err = client.LoadTool("my-tool", ctx) + +// + +llmagent, err := llmagent.New(llmagent.Config{ + Name: "assistant", + Model: model, + Description: "Agent to answer questions.", + Tools: []tool.Tool{&toolboxtool}, +}) +``` + +### For a toolset + +```go +toolboxtools, err := client.LoadToolset("", ctx) + +// + +toolsList := make([]tool.Tool, len(toolboxtools)) + for i := range toolboxtools { + toolsList[i] = &toolboxtools[i] + } + +llmagent, err := llmagent.New(llmagent.Config{ + Name: "assistant", + Model: model, + Description: "Agent to answer questions.", + Tools: toolsList, +}) + +``` + +The reason we have to type assert it before passing it to ADK Go, is because it requires a generic `tool.Tool` interface. You can always convert it back to `ToolboxTool` format to access the specialized methods. + +# Using with Orchestration Frameworks + +To see how the MCP Toolbox Go SDK works with orchestration frameworks, check out these end-to-end examples given below. + +
+ADK Go + +```go +//This sample contains a complete example on how to integrate MCP Toolbox Go SDK with ADK Go using the tbadk package. +package main + +import ( + "context" + "fmt" + "log" + "os" + + "github.com/googleapis/mcp-toolbox-sdk-go/tbadk" + "google.golang.org/adk/agent" + "google.golang.org/adk/agent/llmagent" + "google.golang.org/adk/model/gemini" + "google.golang.org/adk/runner" + "google.golang.org/adk/session" + "google.golang.org/adk/tool" + "google.golang.org/genai" +) + +func main() { + genaiKey := os.Getenv("GEMINI_API_KEY") + toolboxURL := "http://localhost:5000" + ctx := context.Background() + + // Initialize MCP Toolbox client + toolboxClient, err := tbadk.NewToolboxClient(toolboxURL) + if err != nil { + log.Fatalf("Failed to create MCP Toolbox client: %v", err) + } + + toolsetName := "my-toolset" + toolset, err := toolboxClient.LoadToolset(toolsetName, ctx) + if err != nil { + log.Fatalf("Failed to load MCP toolset '%s': %v\nMake sure your Toolbox server is running.", toolsetName, err) + } + + // Create Gemini model + model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ + APIKey: genaiKey, + }) + if err != nil { + log.Fatalf("Failed to create model: %v", err) + } + + tools := make([]tool.Tool, len(toolset)) + for i := range toolset { + tools[i] = &toolset[i] + } + + llmagent, err := llmagent.New(llmagent.Config{ + Name: "hotel_assistant", + Model: model, + Description: "Agent to answer questions about hotels.", + Tools: tools, + }) + if err != nil { + log.Fatalf("Failed to create agent: %v", err) + } + + appName := "hotel_assistant" + userID := "user-123" + + sessionService := session.InMemoryService() + resp, err := sessionService.Create(ctx, &session.CreateRequest{ + AppName: appName, + UserID: userID, + }) + if err != nil { + log.Fatalf("Failed to create the session service: %v", err) + } + session := resp.Session + + r, err := runner.New(runner.Config{ + AppName: appName, + Agent: llmagent, + SessionService: sessionService, + }) + if err != nil { + log.Fatalf("Failed to create runner: %v", err) + } + + query := "Find hotels with Basel in its name." + + fmt.Println(query) + userMsg := genai.NewContentFromText(query, genai.RoleUser) + + streamingMode := agent.StreamingModeSSE + for event, err := range r.Run(ctx, userID, session.ID(), userMsg, agent.RunConfig{ + StreamingMode: streamingMode, + }) { + if err != nil { + fmt.Printf("\nAGENT_ERROR: %v\n", err) + } else { + if event.LLMResponse.Content != nil { + for _, p := range event.LLMResponse.Content.Parts { + if streamingMode != agent.StreamingModeSSE || event.LLMResponse.Partial { + fmt.Print(p.Text) + } + } + } + } + } + fmt.Println() +} +``` + +
\ No newline at end of file diff --git a/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/tbgenkit/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/tbgenkit/_index.md new file mode 100644 index 000000000000..b18bb146427b --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/go-sdk/tbgenkit/_index.md @@ -0,0 +1,119 @@ +--- +title: "Genkit Package" +linkTitle: "Genkit" +type: docs +weight: 3 +description: > + MCP Toolbox Genkit for integrating functionalities of MCP Toolbox into your Agentic apps. +--- + +## Overview + +The `tbgenkit` package provides a Go interface to the MCP Toolbox service, enabling you to load and invoke tools from your own applications. + +## Installation + +```bash +go get github.com/googleapis/mcp-toolbox-sdk-go/tbgenkit +``` +This SDK is supported on Go version 1.24.4 and higher. + +{{< notice note >}} +**Breaking Change Notice**: As of version `0.6.0`, this repository has transitioned to a multi-module structure. +* **For new versions (`v0.6.0`+)**: You must import specific modules (e.g., `go get github.com/googleapis/mcp-toolbox-sdk-go/tbgenkit`). +* **For older versions (`v0.5.1` and below)**: The repository remains a single-module library (`go get github.com/googleapis/mcp-toolbox-sdk-go`). +* Please update your imports and `go.mod` accordingly when upgrading. +{{< /notice >}} + +## Quickstart + +For more information on how to load a `ToolboxTool`, see [the core package](https://github.com/googleapis/mcp-toolbox-sdk-go/tree/main/core) + +## Convert Toolbox Tool to a Genkit Tool + +```go +"github.com/googleapis/mcp-toolbox-sdk-go/tbgenkit" + +func main() { + // Assuming the toolbox tool is loaded + // Make sure to add error checks for debugging + ctx := context.Background() + g, err := genkit.Init(ctx) + + genkitTool, err := tbgenkit.ToGenkitTool(toolboxTool, g) + +} +``` + +# Using with Orchestration Frameworks + +To see how the MCP Toolbox Go SDK works with orchestration frameworks, check out these end-to-end examples given below. + +
+Genkit Go + +```go +//This sample contains a complete example on how to integrate MCP Toolbox Go SDK with Genkit Go using the tbgenkit package. +package main + +import ( + "context" + "fmt" + "log" + + "github.com/googleapis/mcp-toolbox-sdk-go/core" + "github.com/googleapis/mcp-toolbox-sdk-go/tbgenkit" + + "github.com/firebase/genkit/go/ai" + "github.com/firebase/genkit/go/genkit" + "github.com/firebase/genkit/go/plugins/googlegenai" +) + +func main() { + ctx := context.Background() + toolboxClient, err := core.NewToolboxClient("http://127.0.0.1:5000") + if err != nil { + log.Fatalf("Failed to create Toolbox client: %v", err) + } + + // Load the tools using the MCP Toolbox SDK. + tools, err := toolboxClient.LoadToolset("my-toolset", ctx) + if err != nil { + log.Fatalf("Failed to load tools: %v\nMake sure your Toolbox server is running and the tool is configured.", err) + } + + // Initialize genkit + g := genkit.Init(ctx, + genkit.WithPlugins(&googlegenai.GoogleAI{}), + genkit.WithDefaultModel("googleai/gemini-1.5-flash"), + ) + + // Convert your tool to a Genkit tool. + genkitTools := make([]ai.Tool, len(tools)) + for i, tool := range tools { + newTool, err := tbgenkit.ToGenkitTool(tool, g) + if err != nil { + log.Fatalf("Failed to convert tool: %v\n", err) + } + genkitTools[i] = newTool + } + + toolRefs := make([]ai.ToolRef, len(genkitTools)) + + for i, tool := range genkitTools { + toolRefs[i] = tool + } + + // Generate llm response using prompts and tools. + resp, err := genkit.Generate(ctx, g, + ai.WithPrompt("Find hotels in Basel with Basel in it's name."), + ai.WithTools(toolRefs...), + ) + if err != nil { + log.Fatalf("%v\n", err) + } + fmt.Println(resp.Text()) +} +``` + +
\ No newline at end of file diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/_index.md new file mode 100644 index 000000000000..12fda824c9b0 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/_index.md @@ -0,0 +1,73 @@ +--- +title: "Javascript" +type: docs +weight: 2 +description: > + Javascript SDKs to connect to the MCP Toolbox server. +--- + +## Overview + +The MCP Toolbox service provides a centralized way to manage and expose tools +(like API connectors, database query tools, etc.) for use by GenAI applications. + +These JS SDKs act as clients for that service. They handle the communication needed to: + +* Fetch tool definitions from your running Toolbox instance. +* Provide convenient JS objects or functions representing those tools. +* Invoke the tools (calling the underlying APIs/services configured in Toolbox). +* Handle authentication and parameter binding as needed. + +By using these SDKs, you can easily leverage your Toolbox-managed tools directly +within your JS applications or AI orchestration frameworks. + +## Which Package Should I Use? + +Choosing the right package depends on how you are building your application: + +- [`@toolbox-sdk/core`](https://github.com/googleapis/mcp-toolbox-sdk-js/tree/main/packages/toolbox-core): + This is a framework agnostic way to connect the tools to popular frameworks + like Langchain, LlamaIndex and Genkit. +- [`@toolbox-sdk/adk`](https://github.com/googleapis/mcp-toolbox-sdk-js/tree/main/packages/toolbox-adk): + This package provides a seamless way to connect to [Google ADK TS](https://github.com/google/adk-js). + +## Available Packages + +This repository hosts the following TS packages. See the package-specific +README for detailed installation and usage instructions: + +| Package | Target Use Case | Integration | Path | Details (README) | Npm Version | +| :------ | :---------- | :---------- | :---------------------- | :---------- | :---------- | +| `toolbox-core` | Framework-agnostic / Custom applications | Use directly / Custom | `packages/toolbox-core/` | 📄 [View README](https://github.com/googleapis/mcp-toolbox-sdk-js/blob/main/packages/toolbox-core/README.md) | ![npm](https://img.shields.io/npm/v/@toolbox-sdk/core) | +| `toolbox-adk` | ADK applications | ADK | `packages/toolbox-adk/` | 📄 [View README](https://github.com/googleapis/mcp-toolbox-sdk-js/blob/main/packages/toolbox-adk/README.md) | ![npm](https://img.shields.io/npm/v/@toolbox-sdk/adk) | + + +## Getting Started + +To get started using Toolbox tools with an application, follow these general steps: + +1. **Set up and Run the Toolbox Service:** + + Before using the SDKs, you need the main MCP Toolbox service running. Follow + the instructions here: [**Toolbox Getting Started + Guide**](https://github.com/googleapis/genai-toolbox?tab=readme-ov-file#getting-started) + +2. **Install the Appropriate SDK:** + + Choose the package based on your needs (see "[Which Package Should I Use?](#which-package-should-i-use)" above) and install it: + + ```bash + # For the core, framework-agnostic SDK + npm install @toolbox-sdk/core + + # For ADK applications + npm install @toolbox-sdk/adk + ``` + + + +{{< notice note >}} +Source code for [js-sdk](https://github.com/googleapis/mcp-toolbox-sdk-js) +{{< /notice >}} + +## Explore the Javascript SDKs \ No newline at end of file diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/adk/index.md b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/adk/index.md new file mode 100644 index 000000000000..d02c2e4b7d2b --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/adk/index.md @@ -0,0 +1,477 @@ +--- +title: "ADK" +type: docs +weight: 1 +description: > + MCP Toolbox SDK for integrating functionalities of MCP Toolbox into your ADK apps. +--- + +## Overview + +The `@toolbox-sdk/adk` package provides a Javascript interface to the MCP Toolbox service, enabling you to load and invoke tools from your own applications. + +## Supported Environments + +This SDK is a standard Node.js package built with TypeScript, ensuring broad compatibility with the modern JavaScript ecosystem. + +- Node.js: Actively supported on Node.js v18.x and higher. The package is compatible with both modern ES Module (import) and legacy CommonJS (require). +- TypeScript: The SDK is written in TypeScript and ships with its own type declarations, providing a first-class development experience with autocompletion and type-checking out of the box. +- JavaScript: Fully supports modern JavaScript in Node.js environments. + +## Installation + +```bash +npm install @toolbox-sdk/adk +``` + +## Quickstart + + +1. **Start the Toolbox Service** + - Make sure the MCP Toolbox service is running. See the [Toolbox Getting Started Guide](../../../../introduction/_index.md#getting-started). + +2. **Minimal Example** + +Here's a minimal example to get you started. Ensure your Toolbox service is running and accessible. + +```javascript + +import { ToolboxClient } from '@toolbox-sdk/adk'; +const URL = 'http://127.0.0.1:5000'; // Replace with your Toolbox service URL +const client = new ToolboxClient(URL); + +async function quickstart() { + try { + const tools = await client.loadToolset(); + // Use tools + } catch (error) { + console.error("unable to load toolset:", error.message); + } +} +quickstart(); +``` + +{{< notice note>}} + This guide uses modern ES Module (`import`) syntax. If your project uses CommonJS, you can import the library using require: `const { ToolboxClient } = require('@toolbox-sdk/adk')`;. +{{< /notice >}} + +## Usage + +Import and initialize a Toolbox client, pointing it to the URL of your running Toolbox service. + +```javascript +import { ToolboxClient } from '@toolbox-sdk/adk'; + +// Replace with the actual URL where your Toolbox service is running +const URL = 'http://127.0.0.1:5000'; + +let client = new ToolboxClient(URL); +const tools = await client.loadToolset(); + +// Use the client and tools as per requirement +``` + +All interactions for loading and invoking tools happen through this client. + +{{< notice note>}} +Closing the `ToolboxClient` also closes the underlying network session shared by all tools loaded from that client. As a result, any tool instances you have loaded will cease to function and will raise an error if you attempt to invoke them after the client is closed. +{{< /notice >}} + +{{< notice note>}} +For advanced use cases, you can provide an external `AxiosInstance` during initialization (e.g., `ToolboxClient(url, my_session)`). +{{< /notice >}} + +## Transport Protocols + +The SDK supports multiple transport protocols to communicate with the Toolbox server. You can specify the protocol version during client initialization. + +### Available Protocols + +{{< notice note >}} +The native Toolbox protocol (`Protocol.TOOLBOX`) is deprecated and will be removed on March 4, 2026. Please use `Protocol.MCP` or specific MCP versions. +{{< /notice >}} + +- `Protocol.MCP`: The default protocol version (currently aliases to `MCP_v20250618`). +- `Protocol.MCP_v20241105`: Use this for compatibility with older MCP servers (November 2024 version). +- `Protocol.MCP_v20250326`: March 2025 version. +- `Protocol.MCP_v20250618`: June 2025 version. +- `Protocol.MCP_v20251125`: November 2025 version. +- `Protocol.TOOLBOX`: **Deprecated** Legacy Toolbox protocol. + +### Specifying a Protocol + +You can explicitly set the protocol by passing the `protocol` argument to the `ToolboxClient` constructor. + +```javascript +import { ToolboxClient, Protocol } from '@toolbox-sdk/adk'; + +const URL = 'http://127.0.0.1:5000'; + +// Initialize with a specific protocol version +const client = new ToolboxClient(URL, null, null, Protocol.MCP_v20241105); + +const tools = await client.loadToolset(); +``` + +## Loading Tools + +You can load tools individually or in groups (toolsets) as defined in your Toolbox service configuration. Loading a toolset is convenient when working with multiple related functions, while loading a single tool offers more granular control. + +### Load a toolset + +A toolset is a collection of related tools. You can load all tools in a toolset or a specific one: + +```javascript +// Load all tools +const tools = await toolbox.loadToolset() + +// Load a specific toolset +const tools = await toolbox.loadToolset("my-toolset") +``` + +### Load a single tool + +Loads a specific tool by its unique name. This provides fine-grained control. + +```javascript +const tool = await toolbox.loadTool("my-tool") +``` + +## Invoking Tools + +Once loaded, tools behave like awaitable JS functions. You invoke them using `await` and pass arguments corresponding to the parameters defined in the tool's configuration within the Toolbox service. + +```javascript +const tool = await client.loadTool("my-tool") +const result = await tool.runAsync(args: {a: 5, b: 2}) +``` + +{{< notice tip>}} +For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../getting-started/local_quickstart_js.md). +{{< /notice >}} + +## Client to Server Authentication + +This section describes how to authenticate the ToolboxClient itself when +connecting to a Toolbox server instance that requires authentication. This is +crucial for securing your Toolbox server endpoint, especially when deployed on +platforms like Cloud Run, GKE, or any environment where unauthenticated access is restricted. + +This client-to-server authentication ensures that the Toolbox server can verify +the identity of the client making the request before any tool is loaded or +called. It is different from [Authenticating Tools](#authenticating-tools), +which deals with providing credentials for specific tools within an already +connected Toolbox session. + +### When is Client-to-Server Authentication Needed? + +You'll need this type of authentication if your Toolbox server is configured to +deny unauthenticated requests. For example: + +- Your Toolbox server is deployed on Cloud Run and configured to "Require authentication." +- Your server is behind an Identity-Aware Proxy (IAP) or a similar + authentication layer. +- You have custom authentication middleware on your self-hosted Toolbox server. + +Without proper client authentication in these scenarios, attempts to connect or +make calls (like `load_tool`) will likely fail with `Unauthorized` errors. + +### How it works + +The `ToolboxClient` allows you to specify functions that dynamically generate +HTTP headers for every request sent to the Toolbox server. The most common use +case is to add an [Authorization +header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Authorization) +with a bearer token (e.g., a Google ID token). + +These header-generating functions are called just before each request, ensuring +that fresh credentials or header values can be used. + +### Configuration + +You can configure these dynamic headers as seen below: + +```javascript +import { ToolboxClient } from '@toolbox-sdk/adk'; +import {getGoogleIdToken} from '@toolbox-sdk/core/auth' + +const URL = 'http://127.0.0.1:5000'; +const getGoogleIdTokenGetter = () => getGoogleIdToken(URL); +const client = new ToolboxClient(URL, null, {"Authorization": getGoogleIdTokenGetter}); + +// Use the client as usual +``` + +### Authenticating with Google Cloud Servers + +For Toolbox servers hosted on Google Cloud (e.g., Cloud Run) and requiring +`Google ID token` authentication, the helper module +[auth_methods](../core/index.md#authenticating-with-google-cloud-servers) provides utility functions. + +### Step by Step Guide for Cloud Run + +1. **Configure Permissions**: [Grant](https://cloud.google.com/run/docs/securing/managing-access#service-add-principals) the `roles/run.invoker` IAM role on the Cloud + Run service to the principal. This could be your `user account email` or a + `service account`. +2. **Configure Credentials** + - Local Development: Set up + [ADC](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment). + - Google Cloud Environments: When running within Google Cloud (e.g., Compute + Engine, GKE, another Cloud Run service, Cloud Functions), ADC is typically + configured automatically, using the environment's default service account. +3. **Connect to the Toolbox Server** + + ```javascript + import { ToolboxClient } from '@toolbox-sdk/adk'; + import {getGoogleIdToken} from '@toolbox-sdk/core/auth' + + const URL = 'http://127.0.0.1:5000'; + const getGoogleIdTokenGetter = () => getGoogleIdToken(URL); + const client = new ToolboxClient(URL, null, {"Authorization": getGoogleIdTokenGetter}); + + // Use the client as usual + ``` + +## Authenticating Tools + +{{< notice note>}} +**Always use HTTPS** to connect your application with the Toolbox service, especially in **production environments** or whenever the communication involves **sensitive data** (including scenarios where tools require authentication tokens). Using plain HTTP lacks encryption and exposes your application and data to significant security risks, such as eavesdropping and tampering. +{{< /notice >}} + +Tools can be configured within the Toolbox service to require authentication, +ensuring only authorized users or applications can invoke them, especially when +accessing sensitive data. + +### When is Authentication Needed? + +Authentication is configured per-tool within the Toolbox service itself. If a +tool you intend to use is marked as requiring authentication in the service, you +must configure the SDK client to provide the necessary credentials (currently +Oauth2 tokens) when invoking that specific tool. + +### Supported Authentication Mechanisms + +The Toolbox service enables secure tool usage through **Authenticated Parameters**. For detailed information on how these mechanisms work within the Toolbox service and how to configure them, please refer to [Toolbox Service Documentation - Authenticated Parameters](../../../../configuration/tools/_index.md#authenticated-parameters) + +### Step 1: Configure Tools in Toolbox Service + +First, ensure the target tool(s) are configured correctly in the Toolbox service +to require authentication. Refer to the [Toolbox Service Documentation - +Authenticated +Parameters](../../../../configuration/tools/_index.md#authenticated-parameters) +for instructions. + +### Step 2: Configure SDK Client + +Your application needs a way to obtain the required Oauth2 token for the +authenticated user. The SDK requires you to provide a function capable of +retrieving this token *when the tool is invoked*. + +#### Provide an ID Token Retriever Function + +You must provide the SDK with a function (sync or async) that returns the +necessary token when called. The implementation depends on your application's +authentication flow (e.g., retrieving a stored token, initiating an OAuth flow). + +{{< notice note>}} +The name used when registering the getter function with the SDK (e.g., `"my_api_token"`) must exactly match the `name` of the corresponding `authServices` defined in the tool's configuration within the Toolbox service. +{{< /notice >}} + +```javascript + +async function getAuthToken() { + // ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + // This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" // Placeholder +} +``` +{{< notice tip>}} +Your token retriever function is invoked every time an authenticated parameter requires a token for a tool call. Consider implementing caching logic within this function to avoid redundant token fetching or generation, especially for tokens with longer validity periods or if the retrieval process is resource-intensive. +{{< /notice >}} + +#### Option A: Add Authentication to a Loaded Tool + +You can add the token retriever function to a tool object *after* it has been +loaded. This modifies the specific tool instance. + +```javascript +const URL = 'http://127.0.0.1:5000'; +let client = new ToolboxClient(URL); +let tool = await client.loadTool("my-tool") + +const authTool = tool.addAuthTokenGetter("my_auth", get_auth_token) // Single token + +// OR + +const multiAuthTool = tool.addAuthTokenGetters({ + "my_auth_1": getAuthToken1, + "my_auth_2": getAuthToken2, +}) // Multiple tokens +``` + +#### Option B: Add Authentication While Loading Tools + +You can provide the token retriever(s) directly during the `loadTool` or +`loadToolset` calls. This applies the authentication configuration only to the +tools loaded in that specific call, without modifying the original tool objects +if they were loaded previously. + +```javascript +const authTool = await toolbox.loadTool("toolName", {"myAuth": getAuthToken}) + +// OR + +const authTools = await toolbox.loadToolset({"myAuth": getAuthToken}) +``` + +{{< notice note>}} +Adding auth tokens during loading only affect the tools loaded within that call. +{{< /notice >}} + +### Complete Authentication Example + +```javascript +import { ToolboxClient } from '@toolbox-sdk/adk'; + +async function getAuthToken() { + // ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + // This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" // Placeholder +} + +const URL = 'http://127.0.0.1:5000'; +let client = new ToolboxClient(URL); +const tool = await client.loadTool("my-tool"); +const authTool = tool.addAuthTokenGetters({"my_auth": getAuthToken}); +const result = await authTool.runAsync(args: {input:"some input"}); +console.log(result); +``` + +## Binding Parameter Values + +The SDK allows you to pre-set, or "bind", values for specific tool parameters +before the tool is invoked or even passed to an LLM. These bound values are +fixed and will not be requested or modified by the LLM during tool use. + +### Why Bind Parameters? + +- **Protecting sensitive information:** API keys, secrets, etc. +- **Enforcing consistency:** Ensuring specific values for certain parameters. +- **Pre-filling known data:** Providing defaults or context. + +{{< notice note>}} +The parameter names used for binding (e.g., `"api_key"`) must exactly match the parameter names defined in the tool's configuration within the Toolbox service. +{{< /notice >}} + +{{< notice note>}} +You do not need to modify the tool's configuration in the Toolbox service to +> bind parameter values using the SDK. +{{< /notice >}} + +### Option A: Binding Parameters to a Loaded Tool + +Bind values to a tool object *after* it has been loaded. This modifies the +specific tool instance. + +```javascript + +import { ToolboxClient } from '@toolbox-sdk/adk'; + +const URL = 'http://127.0.0.1:5000'; +let client = new ToolboxClient(URL); +const tool = await client.loadTool("my-tool"); + +const boundTool = tool.bindParam("param", "value"); + +// OR + +const boundTool = tool.bindParams({"param": "value"}); +``` + +### Option B: Binding Parameters While Loading Tools + +Specify bound parameters directly when loading tools. This applies the binding +only to the tools loaded in that specific call. + +```javascript +const boundTool = await client.loadTool("my-tool", null, {"param": "value"}) + +// OR + +const boundTools = await client.loadToolset(null, {"param": "value"}) +``` + +{{< notice note>}} +Bound values during loading only affect the tools loaded in that call. +{{< /notice >}} + +### Binding Dynamic Values + +Instead of a static value, you can bind a parameter to a synchronous or +asynchronous function. This function will be called *each time* the tool is +invoked to dynamically determine the parameter's value at runtime. + +```javascript + +async function getDynamicValue() { + // Logic to determine the value + return "dynamicValue"; +} + +const dynamicBoundTool = tool.bindParam("param", getDynamicValue) +``` + +{{< notice note>}} +You don't need to modify tool configurations to bind parameter values. +{{< /notice >}} + +# Using with ADK + +ADK JS: + +```javascript +import {FunctionTool, InMemoryRunner, LlmAgent} from '@google/adk'; +import {Content} from '@google/genai'; +import {ToolboxClient} from '@toolbox-sdk/core' + +const toolboxClient = new ToolboxClient("http://127.0.0.1:5000"); +const loadedTools = await toolboxClient.loadToolset(); + +export const rootAgent = new LlmAgent({ + name: 'weather_time_agent', + model: 'gemini-3-flash-preview', + description: + 'Agent to answer questions about the time and weather in a city.', + instruction: + 'You are a helpful agent who can answer user questions about the time and weather in a city.', + tools: loadedTools, +}); + +async function main() { + const userId = 'test_user'; + const appName = rootAgent.name; + const runner = new InMemoryRunner({agent: rootAgent, appName}); + const session = await runner.sessionService.createSession({ + appName, + userId, + }); + + const prompt = 'What is the weather in New York? And the time?'; + const content: Content = { + role: 'user', + parts: [{text: prompt}], + }; + console.log(content); + for await (const e of runner.runAsync({ + userId, + sessionId: session.id, + newMessage: content, + })) { + if (e.content?.parts?.[0]?.text) { + console.log(`${e.author}: ${JSON.stringify(e.content, null, 2)}`); + } + } +} + +main().catch(console.error); +``` diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/core/index.md b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/core/index.md new file mode 100644 index 000000000000..b06afbb64a83 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/core/index.md @@ -0,0 +1,520 @@ +--- +title: "Core" +type: docs +weight: 2 +description: > + MCP Toolbox Core SDK for integrating functionalities of MCP Toolbox into your Agentic apps. +--- + +## Overview + +The `@toolbox-sdk/core` package provides a Javascript interface to the MCP Toolbox service, enabling you to load and invoke tools from your own applications. + +## Supported Environments + +This SDK is a standard Node.js package built with TypeScript, ensuring broad compatibility with the modern JavaScript ecosystem. + +- Node.js: Actively supported on Node.js v18.x and higher. The package is compatible with both modern ES Module (import) and legacy CommonJS (require). +- TypeScript: The SDK is written in TypeScript and ships with its own type declarations, providing a first-class development experience with autocompletion and type-checking out of the box. +- JavaScript: Fully supports modern JavaScript in Node.js environments. + +## Installation + +```bash +npm install @toolbox-sdk/core +``` + +## Quickstart + + +1. **Start the Toolbox Service** + - Make sure the MCP Toolbox service is running. See the [Toolbox Getting Started Guide](../../../../introduction/_index.md#getting-started). + +2. **Minimal Example** + +Here's a minimal example to get you started. Ensure your Toolbox service is running and accessible. + +```javascript + +import { ToolboxClient } from '@toolbox-sdk/core'; +const URL = 'http://127.0.0.1:5000'; // Replace with your Toolbox service URL +const client = new ToolboxClient(URL); + +async function quickstart() { + try { + const tools = await client.loadToolset(); + // Use tools + } catch (error) { + console.error("unable to load toolset:", error.message); + } +} +quickstart(); +``` + +{{< notice note>}} + This guide uses modern ES Module (`import`) syntax. If your project uses CommonJS, you can import the library using require: `const { ToolboxClient } = require('@toolbox-sdk/core')`;. +{{< /notice >}} + +## Usage + +Import and initialize a Toolbox client, pointing it to the URL of your running Toolbox service. + +```javascript +import { ToolboxClient } from '@toolbox-sdk/core'; + +// Replace with the actual URL where your Toolbox service is running +const URL = 'http://127.0.0.1:5000'; + +let client = new ToolboxClient(URL); +const tools = await client.loadToolset(); + +// Use the client and tools as per requirement +``` + +All interactions for loading and invoking tools happen through this client. + +{{< notice note>}} +Closing the `ToolboxClient` also closes the underlying network session shared by all tools loaded from that client. As a result, any tool instances you have loaded will cease to function and will raise an error if you attempt to invoke them after the client is closed. +{{< /notice >}} + +{{< notice note>}} +For advanced use cases, you can provide an external `AxiosInstance` during initialization (e.g., `ToolboxClient(url, my_session)`). +{{< /notice >}} + +## Transport Protocols + +The SDK supports multiple transport protocols to communicate with the Toolbox server. You can specify the protocol version during client initialization. + +### Available Protocols + +{{ }} +The native Toolbox protocol (Protocol.TOOLBOX) is deprecated and will be removed on March 4, 2026. Please use Protocol.MCP or specific MCP versions. +{{ < /notice >}} + +- `Protocol.MCP`: The default protocol version (currently aliases to `MCP_v20250618`). +- `Protocol.MCP_v20241105`: Use this for compatibility with older MCP servers (November 2024 version). +- `Protocol.MCP_v20250326`: March 2025 version. +- `Protocol.MCP_v20250618`: June 2025 version. +- `Protocol.MCP_v20251125`: November 2025 version. +- `Protocol.TOOLBOX`: **Deprecated** Legacy Toolbox protocol. + +### Specifying a Protocol + +You can explicitly set the protocol by passing the `protocol` argument to the `ToolboxClient` constructor. + +```javascript +import { ToolboxClient, Protocol } from '@toolbox-sdk/core'; + +const URL = 'http://127.0.0.1:5000'; + +// Initialize with a specific protocol version +const client = new ToolboxClient(URL, null, null, Protocol.MCP_v20241105); + +const tools = await client.loadToolset(); +``` + +## Loading Tools + +You can load tools individually or in groups (toolsets) as defined in your Toolbox service configuration. Loading a toolset is convenient when working with multiple related functions, while loading a single tool offers more granular control. + +### Load a toolset + +A toolset is a collection of related tools. You can load all tools in a toolset or a specific one: + +```javascript +// Load all tools +const tools = await client.loadToolset() + +// Load a specific toolset +const tools = await client.loadToolset("my-toolset") +``` + +### Load a single tool + +Loads a specific tool by its unique name. This provides fine-grained control. + +```javascript +const tool = await client.loadTool("my-tool") +``` + +## Invoking Tools + +Once loaded, tools behave like awaitable JS functions. You invoke them using `await` and pass arguments corresponding to the parameters defined in the tool's configuration within the Toolbox service. + +```javascript +const tool = await client.loadTool("my-tool") +const result = await tool({a: 5, b: 2}) +``` + +{{< notice tip>}} +For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../getting-started/local_quickstart_js.md). +{{< /notice >}} + +## Client to Server Authentication + +This section describes how to authenticate the ToolboxClient itself when +connecting to a Toolbox server instance that requires authentication. This is +crucial for securing your Toolbox server endpoint, especially when deployed on +platforms like Cloud Run, GKE, or any environment where unauthenticated access is restricted. + +This client-to-server authentication ensures that the Toolbox server can verify +the identity of the client making the request before any tool is loaded or +called. It is different from [Authenticating Tools](#authenticating-tools), +which deals with providing credentials for specific tools within an already +connected Toolbox session. + +### When is Client-to-Server Authentication Needed? + +You'll need this type of authentication if your Toolbox server is configured to +deny unauthenticated requests. For example: + +- Your Toolbox server is deployed on Cloud Run and configured to "Require authentication." +- Your server is behind an Identity-Aware Proxy (IAP) or a similar authentication layer. +- You have custom authentication middleware on your self-hosted Toolbox server. + +Without proper client authentication in these scenarios, attempts to connect or +make calls (like `load_tool`) will likely fail with `Unauthorized` errors. + +### How it works + +The `ToolboxClient` allows you to specify functions that dynamically generate +HTTP headers for every request sent to the Toolbox server. The most common use +case is to add an [Authorization +header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Authorization) +with a bearer token (e.g., a Google ID token). + +These header-generating functions are called just before each request, ensuring that fresh credentials or header values can be used. + +### Configuration + +You can configure these dynamic headers as seen below: + +```javascript +import { ToolboxClient } from '@toolbox-sdk/core'; +import {getGoogleIdToken} from '@toolbox-sdk/core/auth' + +const URL = 'http://127.0.0.1:5000'; +const getGoogleIdTokenGetter = () => getGoogleIdToken(URL); +const client = new ToolboxClient(URL, null, {"Authorization": getGoogleIdTokenGetter}); + +// Use the client as usual +``` + +### Authenticating with Google Cloud Servers + +For Toolbox servers hosted on Google Cloud (e.g., Cloud Run) and requiring +`Google ID token` authentication, the helper module +[auth_methods](https://github.com/googleapis/mcp-toolbox-sdk-js/blob/main/packages/toolbox-core/src/toolbox_core/authMethods.ts) provides utility functions. + +### Step by Step Guide for Cloud Run + +1. **Configure Permissions**: [Grant](https://cloud.google.com/run/docs/securing/managing-access#service-add-principals) the `roles/run.invoker` IAM role on the Cloud + Run service to the principal. This could be your `user account email` or a + `service account`. +2. **Configure Credentials** + - Local Development: Set up + [ADC](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment). + - Google Cloud Environments: When running within Google Cloud (e.g., Compute + Engine, GKE, another Cloud Run service, Cloud Functions), ADC is typically + configured automatically, using the environment's default service account. +3. **Connect to the Toolbox Server** + + ```javascript + import { ToolboxClient } from '@toolbox-sdk/core'; + import {getGoogleIdToken} from '@toolbox-sdk/core/auth' + + const URL = 'http://127.0.0.1:5000'; + const getGoogleIdTokenGetter = () => getGoogleIdToken(URL); + const client = new ToolboxClient(URL, null, {"Authorization": getGoogleIdTokenGetter}); + + // Use the client as usual + ``` + +## Authenticating Tools + +{{< notice note>}} +**Always use HTTPS** to connect your application with the Toolbox service, especially in **production environments** or whenever the communication involves **sensitive data** (including scenarios where tools require authentication tokens). Using plain HTTP lacks encryption and exposes your application and data to significant security risks, such as eavesdropping and tampering. +{{< /notice >}} + +Tools can be configured within the Toolbox service to require authentication, +ensuring only authorized users or applications can invoke them, especially when +accessing sensitive data. + +### When is Authentication Needed? + +Authentication is configured per-tool within the Toolbox service itself. If a +tool you intend to use is marked as requiring authentication in the service, you +must configure the SDK client to provide the necessary credentials (currently +Oauth2 tokens) when invoking that specific tool. + +### Supported Authentication Mechanisms + +The Toolbox service enables secure tool usage through **Authenticated Parameters**. For detailed information on how these mechanisms work within the Toolbox service and how to configure them, please refer to [Toolbox Service Documentation - Authenticated Parameters](../../../../configuration/tools/_index.md#authenticated-parameters) + +### Step 1: Configure Tools in Toolbox Service + +First, ensure the target tool(s) are configured correctly in the Toolbox service +to require authentication. Refer to the [Toolbox Service Documentation - +Authenticated +Parameters](../../../../configuration/tools/_index.md#authenticated-parameters) +for instructions. + +### Step 2: Configure SDK Client + +Your application needs a way to obtain the required Oauth2 token for the +authenticated user. The SDK requires you to provide a function capable of +retrieving this token *when the tool is invoked*. + +#### Provide an ID Token Retriever Function + +You must provide the SDK with a function (sync or async) that returns the +necessary token when called. The implementation depends on your application's +authentication flow (e.g., retrieving a stored token, initiating an OAuth flow). + +{{< notice note>}} +The name used when registering the getter function with the SDK (e.g., `"my_api_token"`) must exactly match the `name` of the corresponding `authServices` defined in the tool's configuration within the Toolbox service. +{{< /notice >}} + +```javascript + +async function getAuthToken() { + // ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + // This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" // Placeholder +} +``` +{{< notice tip>}} +Your token retriever function is invoked every time an authenticated parameter requires a token for a tool call. Consider implementing caching logic within this function to avoid redundant token fetching or generation, especially for tokens with longer validity periods or if the retrieval process is resource-intensive. +{{< /notice >}} + +#### Option A: Add Authentication to a Loaded Tool + +You can add the token retriever function to a tool object *after* it has been +loaded. This modifies the specific tool instance. + +```javascript +const URL = 'http://127.0.0.1:5000'; +let client = new ToolboxClient(URL); +let tool = await client.loadTool("my-tool") + +const authTool = tool.addAuthTokenGetter("my_auth", get_auth_token) // Single token + +// OR + +const multiAuthTool = tool.addAuthTokenGetters({ + "my_auth_1": getAuthToken1, + "my_auth_2": getAuthToken2, +}) // Multiple tokens +``` + +#### Option B: Add Authentication While Loading Tools + +You can provide the token retriever(s) directly during the `loadTool` or +`loadToolset` calls. This applies the authentication configuration only to the +tools loaded in that specific call, without modifying the original tool objects +if they were loaded previously. + +```javascript +const authTool = await client.loadTool("toolName", {"myAuth": getAuthToken}) + +// OR + +const authTools = await client.loadToolset({"myAuth": getAuthToken}) +``` + +{{< notice note>}} +Adding auth tokens during loading only affect the tools loaded within that call. +{{< /notice >}} + +### Complete Authentication Example + +```javascript +import { ToolboxClient } from '@toolbox-sdk/core'; + +async function getAuthToken() { + // ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + // This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" // Placeholder +} + +const URL = 'http://127.0.0.1:5000'; +let client = new ToolboxClient(URL); +const tool = await client.loadTool("my-tool"); +const authTool = tool.addAuthTokenGetters({"my_auth": getAuthToken}); +const result = await authTool({input:"some input"}); +console.log(result); +``` + +## Binding Parameter Values + +The SDK allows you to pre-set, or "bind", values for specific tool parameters +before the tool is invoked or even passed to an LLM. These bound values are +fixed and will not be requested or modified by the LLM during tool use. + +### Why Bind Parameters? + +- **Protecting sensitive information:** API keys, secrets, etc. +- **Enforcing consistency:** Ensuring specific values for certain parameters. +- **Pre-filling known data:** Providing defaults or context. + +{{< notice note>}} +The parameter names used for binding (e.g., `"api_key"`) must exactly match the parameter names defined in the tool's configuration within the Toolbox service. +{{< /notice >}} + +{{< notice note>}} +You do not need to modify the tool's configuration in the Toolbox service to bind parameter values using the SDK. +{{< /notice >}} + +### Option A: Binding Parameters to a Loaded Tool + +Bind values to a tool object *after* it has been loaded. This modifies the +specific tool instance. + +```javascript + +import { ToolboxClient } from '@toolbox-sdk/core'; + +const URL = 'http://127.0.0.1:5000'; +let client = new ToolboxClient(URL); +const tool = await client.loadTool("my-tool"); + +const boundTool = tool.bindParam("param", "value"); + +// OR + +const boundTool = tool.bindParams({"param": "value"}); +``` + +### Option B: Binding Parameters While Loading Tools + +Specify bound parameters directly when loading tools. This applies the binding +only to the tools loaded in that specific call. + +```javascript +const boundTool = await client.loadTool("my-tool", null, {"param": "value"}) + +// OR + +const boundTools = await client.loadToolset(null, {"param": "value"}) +``` + +{{< notice note>}} +Bound values during loading only affect the tools loaded in that call. +{{< /notice >}} + +### Binding Dynamic Values + +Instead of a static value, you can bind a parameter to a synchronous or +asynchronous function. This function will be called *each time* the tool is +invoked to dynamically determine the parameter's value at runtime. + + +```javascript + +async function getDynamicValue() { + // Logic to determine the value + return "dynamicValue"; +} + +const dynamicBoundTool = tool.bindParam("param", getDynamicValue) +``` + +{{< notice note>}} +You don't need to modify tool configurations to bind parameter values. +{{< /notice >}} + +# Using with Orchestration Frameworks + +
+ +Langchain + +[LangchainJS](https://js.langchain.com/docs/introduction/) + +```javascript +import {ToolboxClient} from "@toolbox-sdk/core" +import { tool } from "@langchain/core/tools"; + +let client = ToolboxClient(URL) +multiplyTool = await client.loadTool("multiply") + +const multiplyNumbers = tool(multiplyTool, { + name: multiplyTool.getName(), + description: multiplyTool.getDescription(), + schema: multiplyTool.getParamSchema() +}); + +await multiplyNumbers.invoke({ a: 2, b: 3 }); +``` + +The `multiplyNumbers` tool is compatible with [Langchain/Langraph +agents](http://js.langchain.com/docs/concepts/agents/) +such as [React +Agents](https://langchain-ai.github.io/langgraphjs/reference/functions/langgraph_prebuilt.createReactAgent.html). + +
+ +
+ +LlamaIndex + +[LlamaindexTS](https://ts.llamaindex.ai/) + +```javascript +import {ToolboxClient} from "@toolbox-sdk/core" +import { tool } from "llamaindex"; + +let client = ToolboxClient(URL) +multiplyTool = await client.loadTool("multiply") + +const multiplyNumbers = tool({ + name: multiplyTool.getName(), + description: multiplyTool.getDescription(), + parameters: multiplyTool.getParamSchema(), + execute: multiplyTool +}); + +await multiplyNumbers.call({ a: 2, b: 3 }); +``` + +The `multiplyNumbers` tool is compatible with LlamaIndex +[agents](https://ts.llamaindex.ai/docs/llamaindex/migration/deprecated/agent) +and [agent +workflows](https://ts.llamaindex.ai/docs/llamaindex/modules/agents/agent_workflow). + +
+ +
+ +Genkit + +[GenkitJS](https://genkit.dev/docs/get-started/#_top) +```javascript +import {ToolboxClient} from "@toolbox-sdk/core" +import { genkit, z } from 'genkit'; +import { googleAI } from '@genkit-ai/googleai'; + + +let client = ToolboxClient(URL) +multiplyTool = await client.loadTool("multiply") + +const ai = genkit({ + plugins: [googleAI()], + model: googleAI.model('gemini-3-flash-preview'), +}); + +const multiplyNumbers = ai.defineTool({ + name: multiplyTool.getName(), + description: multiplyTool.getDescription(), + inputSchema: multiplyTool.getParamSchema(), + }, + multiplyTool, +); + +await ai.generate({ + prompt: 'Can you multiply 5 and 7?', + tools: [multiplyNumbers], +}); +``` + +
diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/_index.md new file mode 100644 index 000000000000..af537566b7e2 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/_index.md @@ -0,0 +1,53 @@ +--- +title: "Javascript: Pre & Post Processing" +type: docs +weight: 2 +description: > + How to add pre- and post- processing to your Agents using JS. +sample_filters: ["Pre & Post Processing", "Javascript", "ADK", "LangChain"] +is_sample: true +--- + +## Prerequisites + +This tutorial assumes that you have set up MCP Toolbox with a basic agent as described in the [local quickstart](../../../../getting-started/local_quickstart_js.md). + +This guide demonstrates how to implement these patterns in your Toolbox applications. + +## Implementation + +{{< tabpane persist=header >}} +{{% tab header="ADK" text=true %}} +The following example demonstrates how to use the `beforeToolCallback` and `afterToolCallback` hooks in the ADK `LlmAgent` to implement pre and post processing logic. + +{{< include "js/adk/agent.js" "js" >}} + +You can also add model-level (`beforeModelCallback`, `afterModelCallback`) and agent-level (`beforeAgentCallback`, `afterAgentCallback`) hooks to intercept messages at different stages of the execution loop. + +For more information, see the [ADK Callbacks documentation](https://google.github.io/adk-docs/callbacks/types-of-callbacks/). +{{% /tab %}} +{{% tab header="Langchain" text=true %}} +The following example demonstrates how to use `ToolboxClient` with LangChain's middleware to implement pre and post processing for tool calls. + +{{< include "js/langchain/agent.js" "js" >}} + +You can also use the `wrapModelCall` hook to intercept messages before and after model calls. +You can also use [node-style hooks](https://docs.langchain.com/oss/javascript/langchain/middleware/custom#node-style-hooks) to intercept messages at the agent and model level. +See the [LangChain Middleware documentation](https://docs.langchain.com/oss/javascript/langchain/middleware/custom#tool-call-monitoring) for details on these additional hook types. + +{{% /tab %}} +{{< /tabpane >}} + +## Results + +The output should look similar to the following. + +{{< notice note >}} +The exact responses may vary due to the non-deterministic nature of LLMs and differences between orchestration frameworks. +{{< /notice >}} + +``` +AI: Booking Confirmed! You earned 500 Loyalty Points with this stay. + +AI: Error: Maximum stay duration is 14 days. +``` diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/agent.js b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/agent.js new file mode 100644 index 000000000000..73811ea317ea --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/agent.js @@ -0,0 +1,103 @@ +import { InMemoryRunner, LlmAgent, LogLevel } from '@google/adk'; +import { ToolboxClient } from '@toolbox-sdk/adk'; + +process.env.GOOGLE_GENAI_API_KEY = process.env.GOOGLE_API_KEY || 'your-api-key'; // Replace it with your API key + +const systemPrompt = ` +You're a helpful hotel assistant. You handle hotel searching, booking and +cancellations. When the user searches for a hotel, mention it's name, id, +location and price tier. Always mention hotel ids while performing any +searches. This is very important for any operations. For any bookings or +cancellations, please provide the appropriate confirmation. Be sure to +update checkin or checkout dates if mentioned by the user. +Don't ask for confirmations from the user. +`; + +// Pre-Processing +function enforeBusinessRules({tool, args}) { + const name = tool.name; + console.log(`POLICY CHECK: Intercepting '${name}'`); + + if (name === "update-hotel" && args.checkin_date && args.checkout_date) { + try { + const start = new Date(args.checkin_date); + const end = new Date(args.checkout_date); + const duration = (end - start) / (1000 * 60 * 60 * 24); // days + + if (duration > 14) { + console.log("BLOCKED: Stay too long"); + return "Error: Maximum stay duration is 14 days."; + } + } catch (e) { + // Ignore invalid dates + } + } + return undefined; +} + +// Post-Processing +function enrichResponse({tool, response}) { + const name = tool.name; + console.log(`ENRICHING RESPONSE: Intercepting '${name}'`); + if (name === "book-hotel") { + let content = response; + if (response && typeof response === "object") { + content = response.content; + } + if (typeof content === "string" && !content.includes("Error")) { + const loyaltyBonus = 500; + const enrichedContent = `Booking Confirmed!\n You earned ${loyaltyBonus} Loyalty Points with this stay.\n\nSystem Details: ${content}`; + + if (response && typeof response === "object") { + return { ...response, content: enrichedContent }; + } + return enrichedContent; + } + } + return response; +} + +async function runTurn(runner, userId, sessionId, prompt) { + console.log(`\nUSER: '${prompt}'`); + const content = { role: 'user', parts: [{ text: prompt }] }; + const stream = runner.runAsync({ userId, sessionId, newMessage: content }); + + let fullText = ""; + for await (const chunk of stream) { + if (chunk.content && chunk.content.parts) { + fullText += chunk.content.parts.map(p => p.text || "").join(""); + } + } + + console.log("-".repeat(50)); + console.log(`AI: ${fullText}`); +} + +export async function main() { + const userId = 'test_user'; + const client = new ToolboxClient('http://127.0.0.1:5000'); + const tools = await client.loadToolset("my-toolset"); + + const rootAgent = new LlmAgent({ + name: 'hotel_agent', + model: 'gemini-2.5-flash', + description: 'Agent for hotel bookings and administration.', + instruction: systemPrompt, + tools: tools, + // Add any pre- and post- processing callbacks + beforeToolCallback: enforeBusinessRules, + afterToolCallback: enrichResponse + }); + + const appName = rootAgent.name; + const runner = new InMemoryRunner({ agent: rootAgent, appName, logLevel: LogLevel.ERROR }); + const session = await runner.sessionService.createSession({ appName, userId }); + + // Turn 1: Booking + await runTurn(runner, userId, session.id, "Book hotel with id 3."); + + // Turn 2: Policy Violation + await runTurn(runner, userId, session.id, "Update my hotel with id 3 with checkin date 2025-01-18 and checkout date 2025-02-10"); +} + +main(); diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/package-lock.json b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/package-lock.json new file mode 100644 index 000000000000..21a302df9d75 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/package-lock.json @@ -0,0 +1,7508 @@ +{ + "name": "adk", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "adk", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@google/adk": "^0.4.0", + "@toolbox-sdk/adk": "^0.2.1" + } + }, + "node_modules/@a2a-js/sdk": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@a2a-js/sdk/-/sdk-0.3.10.tgz", + "integrity": "sha512-t6w5ctnwJkSOMRl6M9rn95C1FTHCPqixxMR0yWXtzhZXEnF6mF1NAK0CfKlG3cz+tcwTxkmn287QZC3t9XPgrA==", + "license": "Apache-2.0", + "dependencies": { + "uuid": "^11.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@bufbuild/protobuf": "^2.10.2", + "@grpc/grpc-js": "^1.11.0", + "express": "^4.21.2 || ^5.1.0" + }, + "peerDependenciesMeta": { + "@bufbuild/protobuf": { + "optional": true + }, + "@grpc/grpc-js": { + "optional": true + }, + "express": { + "optional": true + } + } + }, + "node_modules/@a2a-js/sdk/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@azure-rest/core-client": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-2.5.1.tgz", + "integrity": "sha512-EHaOXW0RYDKS5CFffnixdyRPak5ytiCtU7uXDcP/uiY+A6jFRwNGzzJBiznkCzvi5EYpY+YWinieqHb0oY916A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", + "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", + "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-http-compat": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.3.2.tgz", + "integrity": "sha512-Tf6ltdKzOJEgxZeWLCjMxrxbodB/ZeCbzzA1A2qHbhzAjzjHoBVSUeSl/baT/oHAxhc4qdqVaDKnc2+iE932gw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/abort-controller": "^2.1.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@azure/core-client": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0" + } + }, + "node_modules/@azure/core-lro": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz", + "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.2.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-paging": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", + "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.2.tgz", + "integrity": "sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", + "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", + "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.0.tgz", + "integrity": "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^4.2.0", + "@azure/msal-node": "^3.5.0", + "open": "^10.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/keyvault-common": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@azure/keyvault-common/-/keyvault-common-2.0.0.tgz", + "integrity": "sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-client": "^1.5.0", + "@azure/core-rest-pipeline": "^1.8.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.10.0", + "@azure/logger": "^1.1.4", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/keyvault-keys": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.10.0.tgz", + "integrity": "sha512-eDT7iXoBTRZ2n3fLiftuGJFD+yjkiB1GNqzU2KbY1TLYeXeSPVTVgn2eJ5vmRTZ11978jy2Kg2wI7xa9Tyr8ag==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure-rest/core-client": "^2.3.3", + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.9.0", + "@azure/core-http-compat": "^2.2.0", + "@azure/core-lro": "^2.7.2", + "@azure/core-paging": "^1.6.2", + "@azure/core-rest-pipeline": "^1.19.0", + "@azure/core-tracing": "^1.2.0", + "@azure/core-util": "^1.11.0", + "@azure/keyvault-common": "^2.0.0", + "@azure/logger": "^1.1.4", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", + "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.29.0.tgz", + "integrity": "sha512-/f3eHkSNUTl6DLQHm+bKecjBKcRQxbd/XLx8lvSYp8Nl/HRyPuIPOijt9Dt0sH50/SxOwQ62RnFCmFlGK+bR/w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/msal-common": "15.15.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.15.0.tgz", + "integrity": "sha512-/n+bN0AKlVa+AOcETkJSKj38+bvFs78BaP4rNtv3MJCmPH0YrHiskMRe74OhyZ5DZjGISlFyxqvf9/4QVEi2tw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "3.8.8", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.8.tgz", + "integrity": "sha512-+f1VrJH1iI517t4zgmuhqORja0bL6LDQXfBqkjuMmfTYXTQQnh1EvwwxO3UbKLT05N0obF72SRHFrC1RBDv5Gg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/msal-common": "15.15.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@google-cloud/opentelemetry-cloud-monitoring-exporter": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-monitoring-exporter/-/opentelemetry-cloud-monitoring-exporter-0.21.0.tgz", + "integrity": "sha512-+lAew44pWt6rA4l8dQ1gGhH7Uo95wZKfq/GBf9aEyuNDDLQ2XppGEEReu6ujesSqTtZ8ueQFt73+7SReSHbwqg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@google-cloud/opentelemetry-resource-util": "^3.0.0", + "@google-cloud/precise-date": "^4.0.0", + "google-auth-library": "^9.0.0", + "googleapis": "^137.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/sdk-metrics": "^2.0.0" + } + }, + "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-trace-exporter/-/opentelemetry-cloud-trace-exporter-3.0.0.tgz", + "integrity": "sha512-mUfLJBFo+ESbO0dAGboErx2VyZ7rbrHcQvTP99yH/J72dGaPbH2IzS+04TFbTbEd1VW5R9uK3xq2CqawQaG+1Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@google-cloud/opentelemetry-resource-util": "^3.0.0", + "@grpc/grpc-js": "^1.1.8", + "@grpc/proto-loader": "^0.8.0", + "google-auth-library": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/sdk-trace-base": "^2.0.0" + } + }, + "node_modules/@google-cloud/opentelemetry-resource-util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-resource-util/-/opentelemetry-resource-util-3.0.0.tgz", + "integrity": "sha512-CGR/lNzIfTKlZoZFfS6CkVzx+nsC9gzy6S8VcyaLegfEJbiPjxbMLP7csyhJTvZe/iRRcQJxSk0q8gfrGqD3/Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.22.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", + "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/precise-date": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-4.0.0.tgz", + "integrity": "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", + "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", + "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.19.0.tgz", + "integrity": "sha512-n2FjE7NAOYyshogdc7KQOl/VZb4sneqPjWouSyia9CMDdMhRX5+RIbqalNmC7LOLzuLAN89VlF2HvG8na9G+zQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "<4.1.0", + "abort-controller": "^3.0.0", + "async-retry": "^1.3.3", + "duplexify": "^4.1.3", + "fast-xml-parser": "^5.3.4", + "gaxios": "^6.0.2", + "google-auth-library": "^9.6.3", + "html-entities": "^2.5.2", + "mime": "^3.0.0", + "p-limit": "^3.0.1", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google/adk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@google/adk/-/adk-0.4.0.tgz", + "integrity": "sha512-eASUsrdMX4RHnBRYyRHx0FVau/kffixXSpJFcbGZJVe2xMcKW/NJzPk58QuPyLaPqi6bLQZEW4EecpV8WG0tFw==", + "license": "Apache-2.0", + "dependencies": { + "@a2a-js/sdk": "^0.3.10", + "@google/genai": "^1.37.0", + "@mikro-orm/core": "^6.6.6", + "@mikro-orm/reflection": "^6.6.6", + "@modelcontextprotocol/sdk": "^1.26.0", + "google-auth-library": "^10.3.0", + "lodash-es": "^4.17.23", + "zod": "^4.2.1", + "zod-to-json-schema": "^3.25.1" + }, + "peerDependencies": { + "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.21.0", + "@google-cloud/opentelemetry-cloud-trace-exporter": "^3.0.0", + "@google-cloud/storage": "^7.17.1", + "@mikro-orm/mariadb": "^6.6.6", + "@mikro-orm/mssql": "^6.6.6", + "@mikro-orm/mysql": "^6.6.6", + "@mikro-orm/postgresql": "^6.6.6", + "@mikro-orm/sqlite": "^6.6.6", + "@opentelemetry/api": "1.9.0", + "@opentelemetry/api-logs": "^0.205.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.205.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.205.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.205.0", + "@opentelemetry/resource-detector-gcp": "^0.40.0", + "@opentelemetry/resources": "^2.1.0", + "@opentelemetry/sdk-logs": "^0.205.0", + "@opentelemetry/sdk-metrics": "^2.1.0", + "@opentelemetry/sdk-trace-base": "^2.1.0", + "@opentelemetry/sdk-trace-node": "^2.1.0" + } + }, + "node_modules/@google/adk/node_modules/@modelcontextprotocol/sdk": { + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.27.1.tgz", + "integrity": "sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@google/adk/node_modules/express-rate-limit": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", + "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", + "license": "MIT", + "dependencies": { + "ip-address": "10.0.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/@google/adk/node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google/adk/node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google/adk/node_modules/google-auth-library": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.1.tgz", + "integrity": "sha512-5awwuLrzNol+pFDmKJd0dKtZ0fPLAtoA5p7YO4ODsDu6ONJUVqbYwvv8y2ZBO5MBNp9TJXigB19710kYpBPdtA==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "7.1.3", + "gcp-metadata": "8.1.2", + "google-logging-utils": "1.1.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google/adk/node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@google/adk/node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@google/adk/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@google/adk/node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@google/genai": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.40.0.tgz", + "integrity": "sha512-fhIww8smT0QYRX78qWOiz/nIQhHMF5wXOrlXvj33HBrz3vKDBb+wibLcEmTA+L9dmPD4KmfNr7UF3LDQVTXNjA==", + "license": "Apache-2.0", + "dependencies": { + "google-auth-library": "^10.3.0", + "protobufjs": "^7.5.4", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.25.2" + }, + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + } + } + }, + "node_modules/@google/genai/node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google/genai/node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google/genai/node_modules/google-auth-library": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", + "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^8.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google/genai/node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@google/genai/node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "license": "MIT", + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google/genai/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", + "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@js-joda/core": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.7.0.tgz", + "integrity": "sha512-WBu4ULVVxySLLzK1Ppq+OdfP+adRS4ntmDQT915rzDJ++i95gc2jZkM5B6LWEAwN3lGXpfie3yPABozdD3K3Vg==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@mikro-orm/core": { + "version": "6.6.8", + "resolved": "https://registry.npmjs.org/@mikro-orm/core/-/core-6.6.8.tgz", + "integrity": "sha512-OG+oIYe+gbo0f/3nHn6URFCVVjfwV6QNL8OCG4wU0RsUF4EKgP4K21GjlhHpGUReIWgjhgRaK0lu88fn5kABIA==", + "license": "MIT", + "dependencies": { + "dataloader": "2.2.3", + "dotenv": "17.3.1", + "esprima": "4.0.1", + "fs-extra": "11.3.3", + "globby": "11.1.0", + "mikro-orm": "6.6.8", + "reflect-metadata": "0.2.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/b4nan" + } + }, + "node_modules/@mikro-orm/knex": { + "version": "6.6.8", + "resolved": "https://registry.npmjs.org/@mikro-orm/knex/-/knex-6.6.8.tgz", + "integrity": "sha512-q5ao18KGBQcWfpZUPRLsDP46BAyfqx/LEBlmIJJBnm5L9nxkTahS2tnVTdniwQfaOCxRKKbKJNBI+bLXrkJjpw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fs-extra": "11.3.3", + "knex": "3.1.0", + "sqlstring": "2.3.3" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0", + "better-sqlite3": "*", + "libsql": "*", + "mariadb": "*" + }, + "peerDependenciesMeta": { + "better-sqlite3": { + "optional": true + }, + "libsql": { + "optional": true + }, + "mariadb": { + "optional": true + } + } + }, + "node_modules/@mikro-orm/mariadb": { + "version": "6.6.8", + "resolved": "https://registry.npmjs.org/@mikro-orm/mariadb/-/mariadb-6.6.8.tgz", + "integrity": "sha512-k2r44o9UoiqP00rsKwchCHx7RHQriqjTjKQtxrAjyAExvJ7YWlUqqixIVWw/4SdIVD9UoHJdHSc2+wR9sVX2mA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@mikro-orm/knex": "6.6.8", + "mariadb": "3.4.5" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0" + } + }, + "node_modules/@mikro-orm/mssql": { + "version": "6.6.8", + "resolved": "https://registry.npmjs.org/@mikro-orm/mssql/-/mssql-6.6.8.tgz", + "integrity": "sha512-L0hLmMtJPfc4FOTQXNUtAoupdtLkbSx78ykkZYypMjZzQYokOSZJle+t1hdH4yWX1NlIMLCWWGdwjjziB8xqUA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@mikro-orm/knex": "6.6.8", + "tedious": "19.2.1", + "tsqlstring": "1.0.1" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0" + } + }, + "node_modules/@mikro-orm/mysql": { + "version": "6.6.8", + "resolved": "https://registry.npmjs.org/@mikro-orm/mysql/-/mysql-6.6.8.tgz", + "integrity": "sha512-I5Fo/1sCgYbGLDGQHo/H78PR0Tn74usIp5OKAkIW7pJX6fuvFUmb6a0hj72L63Kll+75DC/ekqS6Fz95CH+dzQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@mikro-orm/knex": "6.6.8", + "mysql2": "3.18.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0" + } + }, + "node_modules/@mikro-orm/postgresql": { + "version": "6.6.8", + "resolved": "https://registry.npmjs.org/@mikro-orm/postgresql/-/postgresql-6.6.8.tgz", + "integrity": "sha512-sWscKbAxXbqP4T9Lowl/m2eUugplszKceaSpSdojAbAMzVOohGbkeR+hfRP0cWuyoJaO4vhzMMsR2X9cYA+t3w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@mikro-orm/knex": "6.6.8", + "pg": "8.19.0", + "postgres-array": "3.0.4", + "postgres-date": "2.1.0", + "postgres-interval": "4.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0" + } + }, + "node_modules/@mikro-orm/reflection": { + "version": "6.6.8", + "resolved": "https://registry.npmjs.org/@mikro-orm/reflection/-/reflection-6.6.8.tgz", + "integrity": "sha512-uG/XHT2bIIYFHFCB9GIgRxw3XM/60916BXsnAu0bu5NWehSq4wys6Grr9PyThVCFmm2QERlOrrXS0QwX1umz2g==", + "license": "MIT", + "dependencies": { + "globby": "11.1.0", + "ts-morph": "27.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0" + } + }, + "node_modules/@mikro-orm/sqlite": { + "version": "6.6.8", + "resolved": "https://registry.npmjs.org/@mikro-orm/sqlite/-/sqlite-6.6.8.tgz", + "integrity": "sha512-ENMR5qCuXKqxV8pmGn0SfbrBQJnd5FgNVhZ2yBH8a0re3NJHuqTUtDxgvYenL/4jsk+/Uq7Dlt1AGgPK8CwhQg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@mikro-orm/knex": "6.6.8", + "fs-extra": "11.3.3", + "sqlite3": "5.1.7", + "sqlstring-sqlite": "0.1.1" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.25.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.3.tgz", + "integrity": "sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@npmcli/move-file/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/move-file/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.205.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.205.0.tgz", + "integrity": "sha512-wBlPk1nFB37Hsm+3Qy73yQSobVn28F4isnWIBvKpd5IUH/eat8bwcL02H9yzmHyyPmukeccSl2mbN5sDQZYnPg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.5.0.tgz", + "integrity": "sha512-uOXpVX0ZjO7heSVjhheW2XEPrhQAWr2BScDPoZ9UDycl5iuHG+Usyc3AIfG6kZeC1GyLpMInpQ6X5+9n69yOFw==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.0.tgz", + "integrity": "sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.205.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.205.0.tgz", + "integrity": "sha512-5JteMyVWiro4ghF0tHQjfE6OJcF7UBUcoEqX3UIQ5jutKP1H+fxFdyhqjjpmeHMFxzOHaYuLlNR1Bn7FOjGyJg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/api-logs": "0.205.0", + "@opentelemetry/core": "2.1.0", + "@opentelemetry/otlp-exporter-base": "0.205.0", + "@opentelemetry/otlp-transformer": "0.205.0", + "@opentelemetry/sdk-logs": "0.205.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.1.0.tgz", + "integrity": "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.205.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.205.0.tgz", + "integrity": "sha512-fFxNQ/HbbpLmh1pgU6HUVbFD1kNIjrkoluoKJkh88+gnmpFD92kMQ8WFNjPnSbjg2mNVnEkeKXgCYEowNW+p1w==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/otlp-exporter-base": "0.205.0", + "@opentelemetry/otlp-transformer": "0.205.0", + "@opentelemetry/resources": "2.1.0", + "@opentelemetry/sdk-metrics": "2.1.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.1.0.tgz", + "integrity": "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.1.0.tgz", + "integrity": "sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.1.0.tgz", + "integrity": "sha512-J9QX459mzqHLL9Y6FZ4wQPRZG4TOpMCyPOh6mkr/humxE1W2S3Bvf4i75yiMW9uyed2Kf5rxmLhTm/UK8vNkAw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/resources": "2.1.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.205.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.205.0.tgz", + "integrity": "sha512-vr2bwwPCSc9u7rbKc74jR+DXFvyMFQo9o5zs+H/fgbK672Whw/1izUKVf+xfWOdJOvuwTnfWxy+VAY+4TSo74Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/otlp-exporter-base": "0.205.0", + "@opentelemetry/otlp-transformer": "0.205.0", + "@opentelemetry/resources": "2.1.0", + "@opentelemetry/sdk-trace-base": "2.1.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.1.0.tgz", + "integrity": "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.1.0.tgz", + "integrity": "sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.1.0.tgz", + "integrity": "sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/resources": "2.1.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.205.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.205.0.tgz", + "integrity": "sha512-2MN0C1IiKyo34M6NZzD6P9Nv9Dfuz3OJ3rkZwzFmF6xzjDfqqCTatc9v1EpNfaP55iDOCLHFyYNCgs61FFgtUQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/otlp-transformer": "0.205.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.1.0.tgz", + "integrity": "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.205.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.205.0.tgz", + "integrity": "sha512-KmObgqPtk9k/XTlWPJHdMbGCylRAmMJNXIRh6VYJmvlRDMfe+DonH41G7eenG8t4FXn3fxOGh14o/WiMRR6vPg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/api-logs": "0.205.0", + "@opentelemetry/core": "2.1.0", + "@opentelemetry/resources": "2.1.0", + "@opentelemetry/sdk-logs": "0.205.0", + "@opentelemetry/sdk-metrics": "2.1.0", + "@opentelemetry/sdk-trace-base": "2.1.0", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.1.0.tgz", + "integrity": "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.1.0.tgz", + "integrity": "sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.1.0.tgz", + "integrity": "sha512-J9QX459mzqHLL9Y6FZ4wQPRZG4TOpMCyPOh6mkr/humxE1W2S3Bvf4i75yiMW9uyed2Kf5rxmLhTm/UK8vNkAw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/resources": "2.1.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.1.0.tgz", + "integrity": "sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/resources": "2.1.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.40.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.40.3.tgz", + "integrity": "sha512-C796YjBA5P1JQldovApYfFA/8bQwFfpxjUbOtGhn1YZkVTLoNQN+kvBwgALfTPWzug6fWsd0xhn9dzeiUcndag==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.0.tgz", + "integrity": "sha512-F8W52ApePshpoSrfsSk1H2yJn9aKjCrbpQF1M9Qii0GHzbfVeFUB+rc3X4aggyZD8x9Gu3Slua+s6krmq6Dt8g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.5.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.205.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.205.0.tgz", + "integrity": "sha512-nyqhNQ6eEzPWQU60Nc7+A5LIq8fz3UeIzdEVBQYefB4+msJZ2vuVtRuk9KxPMw1uHoHDtYEwkr2Ct0iG29jU8w==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/api-logs": "0.205.0", + "@opentelemetry/core": "2.1.0", + "@opentelemetry/resources": "2.1.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.1.0.tgz", + "integrity": "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.1.0.tgz", + "integrity": "sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.1.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.5.0.tgz", + "integrity": "sha512-BeJLtU+f5Gf905cJX9vXFQorAr6TAfK3SPvTFqP+scfIpDQEJfRaGJWta7sJgP+m4dNtBf9y3yvBKVAZZtJQVA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.5.0", + "@opentelemetry/resources": "2.5.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.5.0.tgz", + "integrity": "sha512-VzRf8LzotASEyNDUxTdaJ9IRJ1/h692WyArDBInf5puLCjxbICD6XkHgpuudis56EndyS7LYFmtTMny6UABNdQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/core": "2.5.0", + "@opentelemetry/resources": "2.5.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.5.0.tgz", + "integrity": "sha512-O6N/ejzburFm2C84aKNrwJVPpt6HSTSq8T0ZUMq3xT2XmqT4cwxUItcL5UWGThYuq8RTcbH8u1sfj6dmRci0Ow==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/context-async-hooks": "2.5.0", + "@opentelemetry/core": "2.5.0", + "@opentelemetry/sdk-trace-base": "2.5.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", + "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@toolbox-sdk/adk": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@toolbox-sdk/adk/-/adk-0.2.1.tgz", + "integrity": "sha512-xIIWw8EKgLTya/1LVUk4ozMHiYh6J+rK1TM6IKRJ5CzCNRAWmA4wZu0xjIqynHeI/rY3/YGzQBVG4gO2XqCA0g==", + "license": "Apache-2.0", + "dependencies": { + "@google/adk": "^0.2.0", + "@google/genai": "^1.14.0", + "@modelcontextprotocol/sdk": "1.25.3", + "@toolbox-sdk/core": "^0.2.1", + "axios": "^1.12.2", + "openapi-types": "^12.1.3", + "zod": "^3.24.4" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@toolbox-sdk/adk/node_modules/@google/adk": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@google/adk/-/adk-0.2.5.tgz", + "integrity": "sha512-2puhbLKvxLI8CcQOmBkNkyIrw7e4Qq35DwazQbxEx4tVyR9hRnloMpU9TPNlPHjt4ldtos6MS+akJyPk7tiuWA==", + "license": "Apache-2.0", + "dependencies": { + "@google/genai": "^1.37.0", + "@modelcontextprotocol/sdk": "^1.24.0", + "google-auth-library": "^10.3.0", + "lodash-es": "^4.17.23", + "zod": "3.25.76" + }, + "peerDependencies": { + "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.21.0", + "@google-cloud/opentelemetry-cloud-trace-exporter": "^3.0.0", + "@google-cloud/storage": "^7.17.1", + "@opentelemetry/api": "1.9.0", + "@opentelemetry/api-logs": "^0.205.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.205.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.205.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.205.0", + "@opentelemetry/resource-detector-gcp": "^0.40.0", + "@opentelemetry/resources": "^2.1.0", + "@opentelemetry/sdk-logs": "^0.205.0", + "@opentelemetry/sdk-metrics": "^2.1.0", + "@opentelemetry/sdk-trace-base": "^2.1.0", + "@opentelemetry/sdk-trace-node": "^2.1.0" + } + }, + "node_modules/@toolbox-sdk/adk/node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@toolbox-sdk/adk/node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@toolbox-sdk/adk/node_modules/google-auth-library": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.1.tgz", + "integrity": "sha512-5awwuLrzNol+pFDmKJd0dKtZ0fPLAtoA5p7YO4ODsDu6ONJUVqbYwvv8y2ZBO5MBNp9TJXigB19710kYpBPdtA==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "7.1.3", + "gcp-metadata": "8.1.2", + "google-logging-utils": "1.1.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@toolbox-sdk/adk/node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@toolbox-sdk/adk/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@toolbox-sdk/core": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@toolbox-sdk/core/-/core-0.2.1.tgz", + "integrity": "sha512-yypXFsK0pKMiNaRW7LCP7GdS8eQqF+A30j5T214xuDo+A+f6WsPD8id7SPO0PnyoqNS6A0XipMpNuLmpLvE6sg==", + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.9.0", + "google-auth-library": "^10.0.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "zod": "^3.24.4" + } + }, + "node_modules/@toolbox-sdk/core/node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@toolbox-sdk/core/node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@toolbox-sdk/core/node_modules/google-auth-library": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", + "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^8.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@toolbox-sdk/core/node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@toolbox-sdk/core/node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "license": "MIT", + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@toolbox-sdk/core/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.28.1.tgz", + "integrity": "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==", + "license": "MIT", + "dependencies": { + "minimatch": "^10.0.1", + "path-browserify": "^1.0.1", + "tinyglobby": "^0.2.14" + } + }, + "node_modules/@ts-morph/common/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/node": { + "version": "25.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz", + "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/readable-stream": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.23.tgz", + "integrity": "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/request": { + "version": "2.48.13", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz", + "integrity": "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.5" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", + "license": "MIT", + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@types/request/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@types/request/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "license": "MIT", + "peer": true + }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.3.tgz", + "integrity": "sha512-91fp6CAAJSRtH5ja95T1FHSKa8aPW9/Zw6cta81jlZTUw/+Vq8jM/AfF/14h2b71wwR84JUTW/3Y8QPhDAawFA==", + "license": "MIT", + "peer": true, + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@typespec/ts-http-runtime/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "peer": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "license": "MIT", + "peer": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "license": "MIT", + "peer": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/dataloader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", + "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "peer": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", + "peer": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-builder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz", + "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/fast-xml-parser": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", + "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "fast-xml-builder": "^1.0.0", + "strnum": "^2.1.2" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT", + "peer": true + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT", + "peer": true + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "peer": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "peer": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/getopts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", + "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", + "license": "MIT", + "peer": true + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT", + "peer": true + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-auth-library": { + "version": "9.15.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", + "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/googleapis": { + "version": "137.1.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-137.1.0.tgz", + "integrity": "sha512-2L7SzN0FLHyQtFmyIxrcXhgust77067pkkduqkbIpDuj9JzVnByxsRrcRfUMFQam3rQkWW2B0f1i40IwKDWIVQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "google-auth-library": "^9.0.0", + "googleapis-common": "^7.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-7.2.0.tgz", + "integrity": "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^6.0.3", + "google-auth-library": "^9.7.0", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "license": "MIT", + "peer": true, + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.2.tgz", + "integrity": "sha512-gJnaDHXKDayjt8ue0n8Gs0A007yKXj4Xzb8+cNjZeYsSzzwKc0Lr+OZgYwVfB0pHfUs17EPoLvrOsEaJ9mj+Tg==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause", + "optional": true, + "peer": true + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC", + "peer": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "peer": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT", + "peer": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-md4": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", + "license": "MIT", + "peer": true + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "peer": true, + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/knex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", + "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", + "license": "MIT", + "peer": true, + "dependencies": { + "colorette": "2.0.19", + "commander": "^10.0.0", + "debug": "4.3.4", + "escalade": "^3.1.1", + "esm": "^3.2.25", + "get-package-type": "^0.1.0", + "getopts": "2.3.0", + "interpret": "^2.2.0", + "lodash": "^4.17.21", + "pg-connection-string": "2.6.2", + "rechoir": "^0.8.0", + "resolve-from": "^5.0.0", + "tarn": "^3.0.2", + "tildify": "2.0.0" + }, + "bin": { + "knex": "bin/cli.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependenciesMeta": { + "better-sqlite3": { + "optional": true + }, + "mysql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/knex/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/knex/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT", + "peer": true + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/lru.min": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", + "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", + "license": "MIT", + "peer": true, + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mariadb": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.4.5.tgz", + "integrity": "sha512-gThTYkhIS5rRqkVr+Y0cIdzr+GRqJ9sA2Q34e0yzmyhMCwyApf3OKAC1jnF23aSlIOqJuyaUFUcj7O1qZslmmQ==", + "license": "LGPL-2.1-or-later", + "peer": true, + "dependencies": { + "@types/geojson": "^7946.0.16", + "@types/node": "^24.0.13", + "denque": "^2.1.0", + "iconv-lite": "^0.6.3", + "lru-cache": "^10.4.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/mariadb/node_modules/@types/node": { + "version": "24.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.11.0.tgz", + "integrity": "sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw==", + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/mariadb/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mikro-orm": { + "version": "6.6.8", + "resolved": "https://registry.npmjs.org/mikro-orm/-/mikro-orm-6.6.8.tgz", + "integrity": "sha512-TrKZfgv4brggarPUvXaCm1gduzPxR/pwnI4Bz6njoBzEfavEc33v/ncIfG1pomeurRz8j0DDbI8uD0BUasy31g==", + "license": "MIT", + "engines": { + "node": ">= 18.12.0" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "peer": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT", + "peer": true + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mysql2": { + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.18.2.tgz", + "integrity": "sha512-UfEShBFAZZEAKjySnTUuE7BgqkYT4mx+RjoJ5aqtmwSSvNcJ/QxQPXz/y3jSxNiVRedPfgccmuBtiPCSiEEytw==", + "license": "MIT", + "peer": true, + "dependencies": { + "aws-ssl-profiles": "^1.1.2", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.2", + "long": "^5.3.2", + "lru.min": "^1.1.4", + "named-placeholders": "^1.1.6", + "sql-escaper": "^1.3.3" + }, + "engines": { + "node": ">= 8.0" + }, + "peerDependencies": { + "@types/node": ">= 8" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", + "license": "MIT", + "peer": true, + "dependencies": { + "lru.min": "^1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT", + "peer": true + }, + "node_modules/native-duplexpair": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", + "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==", + "license": "MIT", + "peer": true + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "peer": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "peer": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "peer": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT", + "peer": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pg": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.19.0.tgz", + "integrity": "sha512-QIcLGi508BAHkQ3pJNptsFz5WQMlpGbuBGBaIaXsWK8mel2kQ/rThYI+DbgjUvZrIr7MiuEuc9LcChJoEZK1xQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "pg-connection-string": "^2.11.0", + "pg-pool": "^3.12.0", + "pg-protocol": "^1.12.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.3.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", + "license": "MIT", + "peer": true + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.12.0.tgz", + "integrity": "sha512-eIJ0DES8BLaziFHW7VgJEBPi5hg3Nyng5iKpYtj3wbcAUV9A1wLgWiY7ajf/f/oO1wfxt83phXPY8Emztg7ITg==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.12.0.tgz", + "integrity": "sha512-uOANXNRACNdElMXJ0tPz6RBM0XQ61nONGAwlt8da5zs/iUOOCLBQOHSXnrC6fMsvtjxbOJrZZl5IScGv+7mpbg==", + "license": "MIT", + "peer": true + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "peer": true, + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-types/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-types/node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg-types/node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/pg-connection-string": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.11.0.tgz", + "integrity": "sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==", + "license": "MIT", + "peer": true + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "peer": true, + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/postgres-array": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", + "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", + "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-interval": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-4.0.2.tgz", + "integrity": "sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "peer": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "peer": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "peer": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", + "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/request": "^2.48.8", + "extend": "^3.0.2", + "teeny-request": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/sql-escaper": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/sql-escaper/-/sql-escaper-1.3.3.tgz", + "integrity": "sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==", + "license": "MIT", + "peer": true, + "engines": { + "bun": ">=1.0.0", + "deno": ">=2.0.0", + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" + } + }, + "node_modules/sqlite3": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/sqlstring-sqlite": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sqlstring-sqlite/-/sqlstring-sqlite-0.1.1.tgz", + "integrity": "sha512-9CAYUJ0lEUPYJrswqiqdINNSfq3jqWo/bFJ7tufdoNeSK0Fy+d1kFTxjqO9PIqza0Kri+ZtYMfPVf1aZaFOvrQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "license": "MIT", + "peer": true, + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT", + "peer": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "license": "MIT", + "peer": true + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "peer": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC", + "peer": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tarn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", + "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/tedious": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-19.2.1.tgz", + "integrity": "sha512-pk1Q16Yl62iocuQB+RWbg6rFUFkIyzqOFQ6NfysCltRvQqKwfurgj8v/f2X+CKvDhSL4IJ0cCOfCHDg9PWEEYA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@azure/core-auth": "^1.7.2", + "@azure/identity": "^4.2.1", + "@azure/keyvault-keys": "^4.4.0", + "@js-joda/core": "^5.6.5", + "@types/node": ">=18", + "bl": "^6.1.4", + "iconv-lite": "^0.7.0", + "js-md4": "^0.3.2", + "native-duplexpair": "^1.0.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">=18.17" + } + }, + "node_modules/tedious/node_modules/bl": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz", + "integrity": "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/readable-stream": "^4.0.0", + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" + } + }, + "node_modules/tedious/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/tedious/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/teeny-request": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.9", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/teeny-request/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/teeny-request/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/teeny-request/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT", + "peer": true + }, + "node_modules/ts-morph": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-27.0.2.tgz", + "integrity": "sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==", + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.28.1", + "code-block-writer": "^13.0.3" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "peer": true + }, + "node_modules/tsqlstring": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tsqlstring/-/tsqlstring-1.0.1.tgz", + "integrity": "sha512-6Nzj/SrVg1SF+egwP4OMAgEa83nLKXIE3EHn+6YKinMUeMj8bGIeLuDCkDC3Cc4OIM+xhw4CD0oXKxal8J/Y6A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "license": "BSD", + "peer": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT", + "peer": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "peer": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "peer": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "peer": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + } + } +} diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/package.json b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/package.json new file mode 100644 index 000000000000..c9f762fbf1e5 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/adk/package.json @@ -0,0 +1,16 @@ +{ + "name": "adk", + "version": "1.0.0", + "description": "ADK.js sample for pre/post processing", + "type": "module", + "main": "agent.js", + "scripts": { + "start": "node agent.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@google/adk": "^0.4.0", + "@toolbox-sdk/adk": "^0.2.1" + } +} diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/agent.test.js b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/agent.test.js new file mode 100644 index 000000000000..030793b32291 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/agent.test.js @@ -0,0 +1,91 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { describe, test, before, after } from "node:test"; +import assert from "node:assert/strict"; + +import path from "path"; +import { fileURLToPath } from "url"; + +const ORCH_NAME = process.env.ORCH_NAME; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const orchDir = path.join(__dirname, ORCH_NAME); +const agentPath = path.join(orchDir, "agent.js"); + +const { main: runAgent } = await import(agentPath); + +const GOLDEN_KEYWORDS = [ + "AI:", + "Loyalty Points", + "POLICY CHECK: Intercepting 'update-hotel'" +]; + +describe(`${ORCH_NAME} Pre/Post Processing Agent`, () => { + let capturedOutput = []; + let capturedErrors = []; + let originalLog; + let originalError; + + before(() => { + originalLog = console.log; + originalError = console.error; + + console.log = (...args) => { + const msg = args.map(a => (typeof a === 'object' ? JSON.stringify(a, null, 2) : String(a))).join(' '); + capturedOutput.push(msg); + }; + + console.error = (...args) => { + const msg = args.map(a => (typeof a === 'object' ? JSON.stringify(a, null, 2) : String(a))).join(' '); + capturedErrors.push(msg); + }; + }); + + after(() => { + console.log = originalLog; + console.error = originalError; + }); + + test("runs without errors and outputContainsRequiredKeywords", async () => { + capturedOutput = []; + capturedErrors = []; + + await runAgent(); + assert.equal( + capturedErrors.length, + 0, + `Script produced stderr: ${capturedErrors.join("\n")}` + ); + + const actualOutput = capturedOutput.join("\n"); + + assert.ok( + actualOutput.length > 0, + "Assertion Failed: Script ran successfully but produced no output." + ); + + const missingKeywords = []; + + for (const keyword of GOLDEN_KEYWORDS) { + if (!actualOutput.includes(keyword)) { + missingKeywords.push(keyword); + } + } + + assert.ok( + missingKeywords.length === 0, + `Assertion Failed: The following keywords were missing from the output: [${missingKeywords.join(", ")}]` + ); + }); +}); \ No newline at end of file diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/agent.js b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/agent.js new file mode 100644 index 000000000000..7040a2c6a6a0 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/agent.js @@ -0,0 +1,109 @@ +import { ToolboxClient } from "@toolbox-sdk/core"; +import { ChatGoogleGenerativeAI } from "@langchain/google-genai"; +import { createAgent, createMiddleware, ToolMessage } from "langchain"; +import { tool } from "@langchain/core/tools"; +import { fileURLToPath } from "url"; +import process from "process"; + +const systemPrompt = ` +You're a helpful hotel assistant. You handle hotel searching, booking and +cancellations. When the user searches for a hotel, mention it's name, id, +location and price tier. Always mention hotel ids while performing any +searches. This is very important for any operations. For any bookings or +cancellations, please provide the appropriate confirmation. Be sure to +update checkin or checkout dates if mentioned by the user. +Don't ask for confirmations from the user. +`; + +const GOOGLE_API_KEY = process.env.GOOGLE_API_KEY || 'your-api-key'; // Replace it with your API key + +const businessRulesMiddleware = createMiddleware({ + name: "BusinessRules", + wrapToolCall: async (request, handler) => { + const toolName = request.toolCall.name; + const toolArgs = request.toolCall.args; + console.log(`POLICY CHECK: Intercepting '${toolName}' running with args ${JSON.stringify(toolArgs)}`); + if (toolName === "update-hotel" && toolArgs.checkin_date && toolArgs.checkout_date) { + try { + const start = new Date(toolArgs.checkin_date); + const end = new Date(toolArgs.checkout_date); + const duration = (end - start) / (1000 * 60 * 60 * 24); // days + + if (duration > 14) { + console.log("BLOCKED: Stay too long"); + return ToolMessage({content:'Error: Maximum stay duration is 14 days.', status:"error"}) + } + } catch (e) { + // Ignore invalid dates + } + } + return handler(request); + } +}); + +const enrichmentMiddleware = createMiddleware({ + name: "Enrichment", + wrapToolCall: async (request, handler) => { + const result = await handler(request); + const toolName = request.toolCall.name; + + let content = result; + if (typeof result === 'object' && result !== null && result.content) { + content = result.content; + } + if (toolName === "book-hotel" && typeof content === 'string' && !content.includes("Error")) { + const loyaltyBonus = 500; + const enrichedContent = `Booking Confirmed!\n You earned ${loyaltyBonus} Loyalty Points with this stay.\n\nSystem Details: ${content}`; + if (typeof result === 'object' && result !== null) { + result.content = enrichedContent; + return result; + } + return enrichedContent; + } + return result; + } +}); + +const queries = [ + "Book hotel with id 3.", + "Update my hotel with id 3 with checkin date 2025-01-18 and checkout date 2025-02-10" +]; + +async function main() { + const client = new ToolboxClient("http://127.0.0.1:5000"); + const rawTools = await client.loadToolset("my-toolset"); + const tools = rawTools + .map(t => tool(t, { + name: t.getName(), + description: t.getDescription(), + schema: t.getParamSchema() + })); + + const model = new ChatGoogleGenerativeAI({ + model: "gemini-2.5-flash", + }); + + const agent = createAgent({ + model: model, + tools: tools, + systemPrompt: systemPrompt, + middleware: [businessRulesMiddleware, enrichmentMiddleware] + }); + + for (const query of queries) { + console.log(`\nUSER: '${query}'`); + const result = await agent.invoke({ + messages: [ + { role: "user", content: query}, + ], + }); + console.log("-".repeat(50)); + console.log(`AI: ${result.messages[result.messages.length-1].content}`); + } +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) { + main(); +} + +export { main }; diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/package-lock.json b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/package-lock.json new file mode 100644 index 000000000000..52668fad50c6 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/package-lock.json @@ -0,0 +1,1603 @@ +{ + "name": "langchain", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "langchain", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@langchain/core": "^1.1.26", + "@langchain/google-genai": "^2.1.19", + "@langchain/google-vertexai": "^2.1.19", + "@toolbox-sdk/core": "^0.2.1", + "langchain": "^1.2.25", + "zod": "^3.23.8" + } + }, + "node_modules/@cfworker/json-schema": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz", + "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", + "license": "MIT" + }, + "node_modules/@google/generative-ai": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz", + "integrity": "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@langchain/core": { + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.1.26.tgz", + "integrity": "sha512-Xnwi4xEKEtZcGwjW5xpZVP/Dc+WckFxULMShETuCpD6TxNFS6yRM+FhNUO1DDCkRkGn9b1fuzVZrNYb9W7F32A==", + "license": "MIT", + "dependencies": { + "@cfworker/json-schema": "^4.0.2", + "ansi-styles": "^6.2.3", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": ">=0.5.0 <1.0.0", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "uuid": "^10.0.0", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@langchain/google-common": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/@langchain/google-common/-/google-common-2.1.19.tgz", + "integrity": "sha512-siVJeb1o3QNPdhBgHd+rNj04pvG6iRN/da4G6CTISj00NRlWQDZRxIyI2Z+BUWLmv/4fijXRQN/YiAwCJWtKgQ==", + "license": "MIT", + "dependencies": { + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.1.25" + } + }, + "node_modules/@langchain/google-gauth": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/@langchain/google-gauth/-/google-gauth-2.1.19.tgz", + "integrity": "sha512-guEPA6jCKETReCTrWrJlQGENlMlGKWfDZd0ooJoMJD3+N9Y4IPsMOqWaswfkZrxMmBTSQsBWMsd/0ZWwvU+nSA==", + "license": "MIT", + "dependencies": { + "@langchain/google-common": "2.1.19", + "google-auth-library": "^10.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@langchain/google-genai": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/@langchain/google-genai/-/google-genai-2.1.19.tgz", + "integrity": "sha512-41u+a81BIr8UcGcptJ57Pc7IyEXP75LERzheyS5X+iNSQu5U4vaIMwSNnyJ0hzAlTjSp552XCsa8D2Ifq7icuA==", + "license": "MIT", + "dependencies": { + "@google/generative-ai": "^0.24.0", + "uuid": "^11.1.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.1.25" + } + }, + "node_modules/@langchain/google-genai/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@langchain/google-vertexai": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/@langchain/google-vertexai/-/google-vertexai-2.1.19.tgz", + "integrity": "sha512-VbqlLwe8MUj8VHq3QNiorfSDMaJiZ4pWmI6PS1xLN8MopM/7/KtdtfLpMeVa297fJ9UXQPV/lnJ27qo7g5xiHw==", + "license": "MIT", + "dependencies": { + "@langchain/google-gauth": "2.1.19" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@toolbox-sdk/core": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@toolbox-sdk/core/-/core-0.2.1.tgz", + "integrity": "sha512-yypXFsK0pKMiNaRW7LCP7GdS8eQqF+A30j5T214xuDo+A+f6WsPD8id7SPO0PnyoqNS6A0XipMpNuLmpLvE6sg==", + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.9.0", + "google-auth-library": "^10.0.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "zod": "^3.24.4" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/console-table-printer": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.15.0.tgz", + "integrity": "sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==", + "license": "MIT", + "dependencies": { + "simple-wcswidth": "^1.1.2" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/google-auth-library": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", + "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^8.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "license": "MIT", + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tiktoken": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz", + "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/langchain": { + "version": "1.2.25", + "resolved": "https://registry.npmjs.org/langchain/-/langchain-1.2.25.tgz", + "integrity": "sha512-29qay7nZxkmkH3PRp8cjBpZmGCmA3EW8JwEYqZa0a5CW38nvO2Tr1rbFd26cnlLcxtA5hBRH57/XSPoWLjHJSw==", + "license": "MIT", + "dependencies": { + "@langchain/langgraph": "^1.1.2", + "@langchain/langgraph-checkpoint": "^1.0.0", + "langsmith": ">=0.5.0 <1.0.0", + "uuid": "^10.0.0", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.1.26" + } + }, + "node_modules/langchain/node_modules/@langchain/langgraph": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-1.1.3.tgz", + "integrity": "sha512-o/cEWeocDDSpyBI2MfX07LkNG4LzdRKxwcgUcbR4PyRzhxxCkeIZRCCYkXVQoDbdKqAczJa0D7+yjU9rmA5iHQ==", + "license": "MIT", + "dependencies": { + "@langchain/langgraph-checkpoint": "^1.0.0", + "@langchain/langgraph-sdk": "~1.5.5", + "@standard-schema/spec": "1.1.0", + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": "^1.0.1", + "zod": "^3.25.32 || ^4.2.0", + "zod-to-json-schema": "^3.x" + }, + "peerDependenciesMeta": { + "zod-to-json-schema": { + "optional": true + } + } + }, + "node_modules/langchain/node_modules/@langchain/langgraph-checkpoint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.0.0.tgz", + "integrity": "sha512-xrclBGvNCXDmi0Nz28t3vjpxSH6UYx6w5XAXSiiB1WEdc2xD2iY/a913I3x3a31XpInUW/GGfXXfePfaghV54A==", + "license": "MIT", + "dependencies": { + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": "^1.0.1" + } + }, + "node_modules/langchain/node_modules/@langchain/langgraph/node_modules/@langchain/langgraph-sdk": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-1.5.6.tgz", + "integrity": "sha512-yNRhe4p+R0Xar/nXaTdnhZud79LC0mCgE9G1YCaBOSV6zW13dHMPW8aDs0aKHyRbn3+/LTwAKG+ipeDBA0qxKQ==", + "license": "MIT", + "dependencies": { + "p-queue": "^9.0.1", + "p-retry": "^7.1.1", + "uuid": "^13.0.0" + }, + "peerDependencies": { + "@langchain/core": "^1.1.15", + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + }, + "peerDependenciesMeta": { + "@langchain/core": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/langchain/node_modules/@langchain/langgraph/node_modules/@langchain/langgraph-sdk/node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/langchain/node_modules/@langchain/langgraph/node_modules/p-queue": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", + "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/langchain/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/langchain/node_modules/p-retry": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz", + "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", + "license": "MIT", + "dependencies": { + "is-network-error": "^1.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/langchain/node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/langsmith": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.5.4.tgz", + "integrity": "sha512-qYkNIoKpf0ZYt+cYzrDV+XI3FCexApmZmp8EMs3eDTMv0OvrHMLoxJ9IpkeoXJSX24+GPk0/jXjKx2hWerpy9w==", + "license": "MIT", + "dependencies": { + "@types/uuid": "^10.0.0", + "chalk": "^4.1.2", + "console-table-printer": "^2.12.1", + "p-queue": "^6.6.2", + "semver": "^7.6.3", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "*", + "@opentelemetry/exporter-trace-otlp-proto": "*", + "@opentelemetry/sdk-trace-base": "*", + "openai": "*" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@opentelemetry/exporter-trace-otlp-proto": { + "optional": true + }, + "@opentelemetry/sdk-trace-base": { + "optional": true + }, + "openai": { + "optional": true + } + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-wcswidth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz", + "integrity": "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/package.json b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/package.json new file mode 100644 index 000000000000..26ccf9f4dc2a --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/javascript-sdk/pre-post-processing/langchain/package.json @@ -0,0 +1,20 @@ +{ + "name": "langchain", + "version": "1.0.0", + "description": "LangChain.js sample for pre/post processing", + "type": "module", + "main": "agent.js", + "scripts": { + "start": "node agent.js" + }, + "dependencies": { + "@langchain/core": "^1.1.26", + "@langchain/google-genai": "^2.1.19", + "@langchain/google-vertexai": "^2.1.19", + "@toolbox-sdk/core": "^0.2.1", + "langchain": "^1.2.25", + "zod": "^3.23.8" + }, + "author": "", + "license": "ISC" +} diff --git a/docs/en/documentation/connect-to/toolbox-sdks/pre-post-processing/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/pre-post-processing/_index.md new file mode 100644 index 000000000000..322cf8641b35 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/pre-post-processing/_index.md @@ -0,0 +1,79 @@ +--- +title: "Pre- and Post- Processing" +type: docs +weight: 6 +description: > + Intercept and modify interactions between the agent and its tools either before or after a tool is executed. +--- + +Pre- and post- processing allow developers to intercept and modify interactions between the agent and its tools or the user. + +{{< notice note >}} + +These capabilities are typically features of **orchestration frameworks** (like LangChain, LangGraph, or Agent Builder) rather than the Toolbox SDK itself. However, Toolbox tools are designed to fully leverage these framework capabilities to support robust, secure, and compliant agent architectures. + +{{< /notice >}} + +## Types of Processing + +### Pre-processing + +Pre-processing occurs before a tool is executed or an agent processes a message. Key types include: + +- **Input Sanitization & Redaction**: Detecting and masking sensitive information (like PII) in user queries or tool arguments to prevent it from being logged or sent to unauthorized systems. +- **Business Logic Validation**: Verifying that the proposed action complies with business rules (e.g., ensuring a requested hotel stay does not exceed 14 days, or checking if a user has sufficient permission). +- **Security Guardrails**: Analyzing inputs for potential prompt injection attacks or malicious payloads. + +### Post-processing + +Post-processing occurs after a tool has executed or the model has generated a response. Key types include: + +- **Response Enrichment**: Injecting additional data into the tool output that wasn't part of the raw API response (e.g., calculating loyalty points earned based on the booking value). +- **Output Formatting**: Transforming raw data (like JSON or XML) into a more human-readable or model-friendly format to improve the agent's understanding. +- **Compliance Auditing**: Logging the final outcome of transactions, including the original request and the result, to a secure audit trail. + +## Processing Scopes + +While processing logic can be applied at various levels (Agent, Model, Tool), this guide primarily focuses on **Tool Level** processing, which is most relevant for granular control over tool execution. + +### Tool Level (Primary Focus) + +Wraps individual tool executions. This is best for logic specific to a single tool or a set of tools. + +- **Scope**: Intercepts the raw inputs (arguments) to a tool and its outputs. +- **Use Cases**: Argument validation, output formatting, specific privacy rules for sensitive tools. + +### Other Levels + +It is helpful to understand how tool-level processing differs from other scopes: + +- **Model Level**: Intercepts individual calls to the LLM (prompts and responses). Unlike tool-level, this applies globally to all text sent/received, making it better for global PII redaction or token tracking. +- **Agent Level**: Wraps the high-level execution loop (e.g., a "turn" in the conversation). Unlike tool-level, this envelopes the entire turn (user input to final response), making it suitable for session management or end-to-end auditing. + +## Best Practices + +### Security & Guardrails + +- **Principle of Least Privilege**: Ensure that tools run with the minimum necessary permissions. Middleware is an excellent place to enforce "read-only" modes or verify user identity before executing sensitive actions. +- **Input Sanitization**: Actively strip potential PII (like credit card numbers or raw emails) from tool arguments before logging them. +- **Prompt Injection Defense**: Use pre-processing hooks to scan user inputs for known jailbreak patterns or malicious directives before they reach the model or tools. + +### Observability & Debugging + +- **Structured Logging**: Instead of simple print statements, use structured JSON logging with correlation IDs. This allows you to trace a single user request through multiple agent turns and tool calls. +- **Logging for Testability**: LLM responses are non-deterministic and may summarize away key details. + - **Pattern**: Add explicit logging markers in your post-processing middleware (e.g., `logger.info("ACTION_SUCCESS: ")`). + - **Benefit**: Your integration tests can grep logs for these stable markers to verify tool success, rather than painfully parsing variable natural language responses. + +### Performance & Cost Optimization + +- **Token Economy**: Tools often return verbose JSON. Use post-processing to strip unnecessary fields or summarize large datasets *before* returning the result to the LLM's context window. This saves tokens and reduces latency. +- **Caching**: For read-heavy tools (like "search_knowledge_base"), implement caching middleware to return previous results for identical queries, saving both time and API costs. + +### Error Handling + +- **Graceful Degradation**: If a tool fails (e.g., API timeout), catch the exception in middleware and return a structured error message to the LLM (e.g., `Error: Database timeout, please try again`). +- **Self-Correction**: Well-formatted error messages often allow the LLM to understand *why* a call failed and retry it with corrected parameters automatically. + + +## Samples diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/_index.md new file mode 100644 index 000000000000..b44d22ed80db --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/_index.md @@ -0,0 +1,102 @@ +--- +title: "Python" +type: docs +weight: 1 +description: > + Python SDKs to connect to the MCP Toolbox server. +--- + + +## Overview + +The MCP Toolbox service provides a centralized way to manage and expose tools +(like API connectors, database query tools, etc.) for use by GenAI applications. + +These Python SDKs act as clients for that service. They handle the communication needed to: + +* Fetch tool definitions from your running Toolbox instance. +* Provide convenient Python objects or functions representing those tools. +* Invoke the tools (calling the underlying APIs/services configured in Toolbox). +* Handle authentication and parameter binding as needed. + +By using these SDKs, you can easily leverage your Toolbox-managed tools directly +within your Python applications or AI orchestration frameworks. + +## Which Package Should I Use? + +Choosing the right package depends on how you are building your application: + +* [`toolbox-adk`](adk): + Use this package if you are building your application using Google ADK (Agent Development Kit). + It provides tools that are directly compatible with the + Google ADK ecosystem (`BaseTool` / `BaseToolset` interface) handling authentication propagation, header management, and tool wrapping automatically. +* [`toolbox-core`](core): + Use this package if you are not using LangChain/LangGraph or any other + orchestration framework, or if you need a framework-agnostic way to interact + with Toolbox tools (e.g., for custom orchestration logic or direct use in + Python scripts). +* [`toolbox-langchain`](langchain): + Use this package if you are building your application using the LangChain or + LangGraph frameworks. It provides tools that are directly compatible with the + LangChain ecosystem (`BaseTool` interface), simplifying integration. +* [`toolbox-llamaindex`](llamaindex): + Use this package if you are building your application using the LlamaIndex framework. + It provides tools that are directly compatible with the + LlamaIndex ecosystem (`BaseTool` interface), simplifying integration. + + +## Available Packages + +This repository hosts the following Python packages. See the package-specific +README for detailed installation and usage instructions: + +| Package | Target Use Case | Integration | Path | Details (README) | PyPI Status | +| :------ | :---------- | :---------- | :---------------------- | :---------- | :--------- +| `toolbox-adk` | Google ADK applications | Google ADK | `packages/toolbox-adk/` | 📄 [View README](https://github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-adk/README.md) | ![pypi version](https://img.shields.io/pypi/v/toolbox-adk.svg) | +| `toolbox-core` | Framework-agnostic / Custom applications | Use directly / Custom | `packages/toolbox-core/` | 📄 [View README](https://github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-core/README.md) | ![pypi version](https://img.shields.io/pypi/v/toolbox-core.svg) | +| `toolbox-langchain` | LangChain / LangGraph applications | LangChain / LangGraph | `packages/toolbox-langchain/` | 📄 [View README](https://github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-langchain/README.md) | ![pypi version](https://img.shields.io/pypi/v/toolbox-langchain.svg) | +| `toolbox-llamaindex` | LlamaIndex applications | LlamaIndex | `packages/toolbox-llamaindex/` | 📄 [View README](https://github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-llamaindex/README.md) | ![pypi version](https://img.shields.io/pypi/v/toolbox-llamaindex.svg) | + + +## Getting Started + +To get started using Toolbox tools with an application, follow these general steps: + +1. **Set up and Run the Toolbox Service:** + + Before using the SDKs, you need the main MCP Toolbox service running. Follow + the instructions here: [**Toolbox Getting Started + Guide**](https://github.com/googleapis/genai-toolbox?tab=readme-ov-file#getting-started) + +2. **Install the Appropriate SDK:** + + Choose the package based on your needs (see "[Which Package Should I Use?](#which-package-should-i-use)" above) and install it: + + ```bash + # For the Google ADK Integration + pip install google-adk[toolbox] + + # OR + + # For the core, framework-agnostic SDK + pip install toolbox-core + + # OR + + # For LangChain/LangGraph integration + pip install toolbox-langchain + + # OR + + # For the LlamaIndex integration + pip install toolbox-llamaindex + ``` + + + +{{< notice note >}} +Source code for [python-sdk](https://github.com/googleapis/mcp-toolbox-sdk-python) +{{< /notice >}} + + +## Explore the Python SDKs \ No newline at end of file diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/adk/index.md b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/adk/index.md new file mode 100644 index 000000000000..8804a0e03217 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/adk/index.md @@ -0,0 +1,251 @@ +--- +title: "ADK" +type: docs +weight: 1 +description: > + MCP Toolbox SDK for integrating functionalities of MCP Toolbox into your ADK apps. +--- + +## Overview + +The `toolbox-adk` package provides a Python interface to the MCP Toolbox service, enabling you to load and invoke tools from your own applications. + +## Installation + +```bash +pip install google-adk[toolbox] +``` + +## Usage + +The primary entry point is the `ToolboxToolset`, which loads tools from a remote Toolbox server and adapts them for use with ADK agents. + +{{< notice note>}} +This package contains the core implementation of the `ToolboxToolset`. The `ToolboxToolset` provided in the [`google-adk`](https://github.com/google/adk-python/blob/758d337c76d877e3174c35f06551cc9beb1def06/src/google/adk/tools/toolbox_toolset.py#L35) package is a shim that simply delegates all functionality to this implementation. +{{< /notice >}} + +```python +from google.adk.tools.toolbox_toolset import ToolboxToolset +from google.adk.agents import Agent + +# Create the Toolset +toolset = ToolboxToolset( + server_url="http://127.0.0.1:5000" +) + +# Use in your ADK Agent +agent = Agent(tools=[toolset]) +``` + +## Transport Protocols + +The SDK supports multiple transport protocols for communicating with the Toolbox server. By default, the client uses the latest supported version of the **Model Context Protocol (MCP)**. + +You can explicitly select a protocol using the `protocol` option during toolset initialization. This is useful if you need to use the native Toolbox HTTP protocol or pin the client to a specific legacy version of MCP. + +{{< notice note>}} +* **Native Toolbox Transport**: This uses the service's native **REST over HTTP** API. +* **MCP Transports**: These options use the **Model Context Protocol over HTTP**. +{{< /notice >}} + +### Supported Protocols + +| Constant | Description | +| :--- | :--- | +| `Protocol.MCP` | **(Default)** Alias for the default MCP version (currently `2025-06-18`). | +| `Protocol.TOOLBOX` | **DEPRECATED**: The native Toolbox HTTP protocol. Will be removed on March 4, 2026. | +| `Protocol.MCP_v20251125` | MCP Protocol version 2025-11-25. | +| `Protocol.MCP_v20250618` | MCP Protocol version 2025-06-18. | +| `Protocol.MCP_v20250326` | MCP Protocol version 2025-03-26. | +| `Protocol.MCP_v20241105` | MCP Protocol version 2024-11-05. | + +{{< notice note >}} +The **Native Toolbox Protocol** (`Protocol.TOOLBOX`) is deprecated and will be removed on **March 4, 2026**. +Please migrate to using the **MCP Protocol** (`Protocol.MCP`), which is the default. +{{< /notice >}} + +### Example + +If you wish to use the native Toolbox protocol: + +```python +from toolbox_adk import ToolboxToolset +from toolbox_core.protocol import Protocol + +toolset = ToolboxToolset( + server_url="http://127.0.0.1:5000", + protocol=Protocol.TOOLBOX +) +``` + +If you want to pin the MCP Version 2025-03-26: + +```python +from toolbox_adk import ToolboxToolset +from toolbox_core.protocol import Protocol + +toolset = ToolboxToolset( + server_url="http://127.0.0.1:5000", + protocol=Protocol.MCP_v20250326 +) +``` + +{{< notice tip>}} +By default, it uses **Toolbox Identity** (no authentication), which is suitable for local development. + +For production environments (Cloud Run, GKE) or accessing protected resources, see the [Authentication](#authentication) section for strategies like Workload Identity or OAuth2. +{{< /notice >}} + +## Authentication + +The `ToolboxToolset` requires credentials to authenticate with the Toolbox server. You can configure these credentials using the `CredentialStrategy` factory methods. + +The strategies handle two main types of authentication: +* **Client-to-Server**: Securing the connection to the Toolbox server (e.g., Workload Identity, API keys). +* **User Identity**: Authenticating the end-user for specific tools (e.g., 3-legged OAuth). + +### 1. Workload Identity (ADC) +*Recommended for Cloud Run, GKE, or local development with `gcloud auth login`.* + +Uses the agent's Application Default Credentials (ADC) to generate an OIDC token. This is the standard way for one service to authenticate to another on Google Cloud. + +```python +from toolbox_adk import CredentialStrategy, ToolboxToolset + +# target_audience: The URL of your Toolbox server +creds = CredentialStrategy.workload_identity(target_audience="https://my-toolbox-service.run.app") + +toolset = ToolboxToolset( + server_url="https://my-toolbox-service.run.app", + credentials=creds +) +``` + +### 2. User Identity (OAuth2) +*Recommended for tools that act on behalf of the user.* + +Configures the ADK-native interactive 3-legged OAuth flow to get consent and credentials from the end-user at runtime. This strategy is passed to the `ToolboxToolset` just like any other credential strategy. + +```python +from toolbox_adk import CredentialStrategy, ToolboxToolset + +creds = CredentialStrategy.user_identity( + client_id="YOUR_CLIENT_ID", + client_secret="YOUR_CLIENT_SECRET", + scopes=["https://www.googleapis.com/auth/cloud-platform"] +) + +# The toolset will now initiate OAuth flows when required by tools +toolset = ToolboxToolset( + server_url="...", + credentials=creds +) +``` + +### 3. API Key +*Use a static API key passed in a specific header (default: `X-API-Key`).* + +```python +from toolbox_adk import CredentialStrategy + +# Default header: X-API-Key +creds = CredentialStrategy.api_key(key="my-secret-key") + +# Custom header +creds = CredentialStrategy.api_key(key="my-secret-key", header_name="X-My-Header") +``` + +### 4. HTTP Bearer Token +*Manually supply a static bearer token.* + +```python +from toolbox_adk import CredentialStrategy + +creds = CredentialStrategy.manual_token(token="your-static-bearer-token") +``` + +### 5. Manual Google Credentials +*Use an existing `google.auth.credentials.Credentials` object.* + +```python +from toolbox_adk import CredentialStrategy +import google.auth + +creds_obj, _ = google.auth.default() +creds = CredentialStrategy.manual_credentials(credentials=creds_obj) +``` + +### 6. Toolbox Identity (No Auth) +*Use this if your Toolbox server does not require authentication (e.g., local development).* + +```python +from toolbox_adk import CredentialStrategy + +creds = CredentialStrategy.toolbox_identity() +``` + +### 7. Native ADK Integration +*Convert ADK-native `AuthConfig` or `AuthCredential` objects.* + +```python +from toolbox_adk import CredentialStrategy + +# From AuthConfig +creds = CredentialStrategy.from_adk_auth_config(auth_config) + +# From AuthCredential + AuthScheme +creds = CredentialStrategy.from_adk_credentials(auth_credential, scheme) +``` + +### 8. Tool-Specific Authentication +*Resolve authentication tokens dynamically for specific tools.* + +Some tools may define their own authentication requirements (e.g., Salesforce OAuth, GitHub PAT) via `authSources` in their schema. You can provide a mapping of getters to resolve these tokens at runtime. + +```python +async def get_salesforce_token(): + # Fetch token from secret manager or reliable source + return "sf-access-token" + +toolset = ToolboxToolset( + server_url="...", + auth_token_getters={ + "salesforce-auth": get_salesforce_token, # Async callable + "github-pat": lambda: "my-pat-token" # Sync callable or static lambda + } +) +``` + +## Advanced Configuration + +### Additional Headers + +You can inject custom headers into every request made to the Toolbox server. This is useful for passing tracing IDs, API keys, or other metadata. + +```python +toolset = ToolboxToolset( + server_url="...", + additional_headers={ + "X-Trace-ID": "12345", + "X-My-Header": lambda: get_dynamic_header_value() # Can be a callable + } +) +``` + +### Parameter Binding + +Bind values to tool parameters globally across all loaded tools. These values will be **fixed** and **hidden** from the LLM. + +* **Schema Hiding**: The bound parameters are removed from the tool schema sent to the model, simplifying the context window. +* **Auto-Injection**: The values are automatically injected into the tool arguments during execution. + +```python +toolset = ToolboxToolset( + server_url="...", + bound_params={ + # 'region' will be hidden from the LLM and injected automatically + "region": "us-central1", + "api_key": lambda: get_api_key() # Can be a callable + } +) +``` diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/core/index.md b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/core/index.md new file mode 100644 index 000000000000..7b870f0bcd95 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/core/index.md @@ -0,0 +1,547 @@ +--- +title: "Core" +type: docs +weight: 2 +description: > + MCP Toolbox Core SDK for integrating functionalities of MCP Toolbox into your Agentic apps. +--- + +## Overview + +The `toolbox-core` package provides a Python interface to the MCP Toolbox service, enabling you to load and invoke tools from your own applications. + +## Installation + +```bash +pip install toolbox-core +``` + +{{< notice note >}} +* The primary `ToolboxClient` is asynchronous and requires using `await` for loading and invoking tools, as shown in most examples. +* Asynchronous code needs to run within an event loop (e.g., using `asyncio.run()` or in an async framework). See the [Python `asyncio` documentation](https://docs.python.org/3/library/asyncio-task.html) for more details. +* If you prefer synchronous execution, refer to the [Synchronous Usage](#synchronous-usage) section below. +{{< /notice >}} + +{{< notice note>}} +The `ToolboxClient` (and its synchronous counterpart `ToolboxSyncClient`) interacts with network resources using an underlying HTTP client session. You should remember to use a context manager or explicitly call `close()` to clean up these resources. If you provide your own session, you'll need to close it in addition to calling `ToolboxClient.close()`. +{{< /notice >}} + +## Quickstart + +1. **Start the Toolbox Service** + - Make sure the MCP Toolbox service is running on port `5000` of your local machine. See the [Toolbox Getting Started Guide](../../../../introduction/_index.md#getting-started). + +2. **Minimal Example** + +```python +import asyncio +from toolbox_core import ToolboxClient + +async def main(): + # Replace with the actual URL where your Toolbox service is running + async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + weather_tool = await toolbox.load_tool("get_weather") + result = await weather_tool(location="London") + print(result) + +if __name__ == "__main__": + asyncio.run(main()) +``` + + +{{< notice tip>}} +For a complete, end-to-end example including setting up the service and using an SDK, see the full tutorial: [**Toolbox Quickstart Tutorial**](../../../../getting-started/local_quickstart.md) +{{< /notice >}} + +{{< notice note>}} +If you initialize `ToolboxClient` without providing an external session and cannot use `async with`, you must explicitly close the client using `await toolbox.close()` in a `finally` block. This ensures the internally created session is closed. + + ```py + toolbox = ToolboxClient("http://127.0.0.1:5000") + try: + # ... use toolbox ... + finally: + await toolbox.close() + ``` +{{< /notice >}} + +## Usage + +Import and initialize an MCP Toolbox client, pointing it to the URL of your running +Toolbox service. + +```py +from toolbox_core import ToolboxClient + +# Replace with your Toolbox service's URL +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: +``` + +All interactions for loading and invoking tools happen through this client. + +{{< notice tip>}} +For advanced use cases, you can provide an external `aiohttp.ClientSession` during initialization (e.g., `ToolboxClient(url, session=my_session)`). If you provide your own session, you are responsible for managing its lifecycle; `ToolboxClient` *will not* close it. +{{< /notice >}} + +{{< notice note>}} +Closing the `ToolboxClient` also closes the underlying network session shared by all tools loaded from that client. As a result, any tool instances you have loaded will cease to function and will raise an error if you attempt to invoke them after the client is closed. +{{< /notice >}} + +## Transport Protocols + +The SDK supports multiple transport protocols for communicating with the Toolbox server. By default, the client uses the latest supported version of the **Model Context Protocol (MCP)**. + +You can explicitly select a protocol using the `protocol` option during client initialization. This is useful if you need to use the native Toolbox HTTP protocol or pin the client to a specific legacy version of MCP. + +{{< notice note >}} +* **Native Toolbox Transport**: This uses the service's native **REST over HTTP** API. +* **MCP Transports**: These options use the **Model Context Protocol over HTTP**. +{{< /notice >}} + +### Supported Protocols + +| Constant | Description | +| :--- | :--- | +| `Protocol.MCP` | **(Default)** Alias for the default MCP version (currently `2025-06-18`). | +| `Protocol.TOOLBOX` | **DEPRECATED**: The native Toolbox HTTP protocol. Will be removed on March 4, 2026. | +| `Protocol.MCP_v20251125` | MCP Protocol version 2025-11-25. | +| `Protocol.MCP_v20250618` | MCP Protocol version 2025-06-18. | +| `Protocol.MCP_v20241105` | MCP Protocol version 2024-11-05. | + +{{< notice note >}} +The **Native Toolbox Protocol** (`Protocol.TOOLBOX`) is deprecated and will be removed on **March 4, 2026**. +Please migrate to using the **MCP Protocol** (`Protocol.MCP`), which is the default. +{{< /notice >}} + +### Example + +If you wish to use the native Toolbox protocol: + +```py +from toolbox_core import ToolboxClient +from toolbox_core.protocol import Protocol + +async with ToolboxClient("http://127.0.0.1:5000", protocol=Protocol.TOOLBOX) as toolbox: + # Use client + pass +``` + +If you want to pin the MCP Version 2025-03-26: + +```py +from toolbox_core import ToolboxClient +from toolbox_core.protocol import Protocol + +async with ToolboxClient("http://127.0.0.1:5000", protocol=Protocol.MCP_v20250326) as toolbox: + # Use client + pass +``` + +## Loading Tools + +You can load tools individually or in groups (toolsets) as defined in your +Toolbox service configuration. Loading a toolset is convenient when working with +multiple related functions, while loading a single tool offers more granular +control. + +### Load a toolset + +A toolset is a collection of related tools. You can load all tools in a toolset +or a specific one: + +```py +# Load all tools +tools = await toolbox.load_toolset() + +# Load a specific toolset +tools = await toolbox.load_toolset("my-toolset") +``` + +### Load a single tool + +Loads a specific tool by its unique name. This provides fine-grained control. + +```py +tool = await toolbox.load_tool("my-tool") +``` + +## Invoking Tools + +Once loaded, tools behave like awaitable Python functions. You invoke them using +`await` and pass arguments corresponding to the parameters defined in the tool's +configuration within the Toolbox service. + +```py +tool = await toolbox.load_tool("my-tool") +result = await tool("foo", bar="baz") +``` + +{{< notice tip>}} +For a more comprehensive guide on setting up the Toolbox service itself, which you'll need running to use this SDK, please refer to the [Toolbox Quickstart Guide](../../../../getting-started/local_quickstart.md). +{{< /notice >}} + +## Synchronous Usage + +By default, the `ToolboxClient` and the `ToolboxTool` objects it produces behave like asynchronous Python functions, requiring the use of `await`. + +If your application primarily uses synchronous code, or you prefer not to manage an asyncio event loop, you can use the synchronous alternatives provided: + +* `ToolboxSyncClient`: The synchronous counterpart to `ToolboxClient`. +* `ToolboxSyncTool`: The synchronous counterpart to `ToolboxTool`. + +The `ToolboxSyncClient` handles communication with the Toolbox service synchronously and produces `ToolboxSyncTool` instances when you load tools. You do not use the `await` keyword when interacting with these synchronous versions. + +```py +from toolbox_core import ToolboxSyncClient + +with ToolboxSyncClient("http://127.0.0.1:5000") as toolbox: + weather_tool = toolbox.load_tool("get_weather") + result = weather_tool(location="Paris") + print(result) +``` + +{{< notice tip>}} +While synchronous invocation is available for convenience, it's generally considered best practice to use asynchronous operations (like those provided by the default `ToolboxClient` and `ToolboxTool`) for an I/O-bound task like tool invocation. Asynchronous programming allows for cooperative multitasking, often leading to better performance and resource utilization, especially in applications handling concurrent requests. +{{< /notice >}} + +## Use with LangGraph + +The Toolbox Core SDK integrates smoothly with frameworks like LangGraph, +allowing you to incorporate tools managed by the Toolbox service into your +agentic workflows. + +{{< notice tip>}} +The loaded tools (both async `ToolboxTool` and sync `ToolboxSyncTool`) are callable and can often be used directly. However, to ensure parameter descriptions from Google-style docstrings are accurately parsed and made available to the LLM (via `bind_tools()`) and LangGraph internals, it's recommended to wrap the loaded tools using LangChain's [`StructuredTool`](https://python.langchain.com/api_reference/core/tools/langchain_core.tools.structured.StructuredTool.html). +{{< /notice >}} + + +Here's a conceptual example adapting the [official LangGraph tool calling +guide](https://langchain-ai.github.io/langgraph/how-tos/tool-calling): + +```py +import asyncio +from typing import Annotated +from typing_extensions import TypedDict +from langchain_core.messages import HumanMessage, BaseMessage +from toolbox_core import ToolboxClient +from langchain_google_vertexai import ChatVertexAI +from langgraph.graph import StateGraph, START, END +from langgraph.prebuilt import ToolNode +from langchain.tools import StructuredTool +from langgraph.graph.message import add_messages + +class State(TypedDict): + messages: Annotated[list[BaseMessage], add_messages] + +async def main(): + async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tools = await toolbox.load_toolset() + wrapped_tools = [StructuredTool.from_function(tool, parse_docstring=True) for tool in tools] + model_with_tools = ChatVertexAI(model="gemini-3-flash-preview").bind_tools(wrapped_tools) + tool_node = ToolNode(wrapped_tools) + + def call_agent(state: State): + response = model_with_tools.invoke(state["messages"]) + return {"messages": [response]} + + def should_continue(state: State): + last_message = state["messages"][-1] + if last_message.tool_calls: + return "tools" + return END + + graph_builder = StateGraph(State) + + graph_builder.add_node("agent", call_agent) + graph_builder.add_node("tools", tool_node) + + graph_builder.add_edge(START, "agent") + graph_builder.add_conditional_edges( + "agent", + should_continue, + ) + graph_builder.add_edge("tools", "agent") + + app = graph_builder.compile() + + prompt = "What is the weather in London?" + inputs = {"messages": [HumanMessage(content=prompt)]} + + print(f"User: {prompt}\n") + print("--- Streaming Agent Steps ---") + + events = app.stream( + inputs, + stream_mode="values", + ) + + for event in events: + event["messages"][-1].pretty_print() + print("\n---\n") + +asyncio.run(main()) +``` + +## Client to Server Authentication + +This section describes how to authenticate the ToolboxClient itself when +connecting to an MCP Toolbox server instance that requires authentication. This is +crucial for securing your Toolbox server endpoint, especially when deployed on +platforms like Cloud Run, GKE, or any environment where unauthenticated access is restricted. + +This client-to-server authentication ensures that the Toolbox server can verify +the identity of the client making the request before any tool is loaded or +called. It is different from [Authenticating Tools](#authenticating-tools), +which deals with providing credentials for specific tools within an already +connected Toolbox session. + +### When is Client-to-Server Authentication Needed? + +You'll need this type of authentication if your Toolbox server is configured to +deny unauthenticated requests. For example: + +- Your Toolbox server is deployed on Cloud Run and configured to "Require authentication." +- Your server is behind an Identity-Aware Proxy (IAP) or a similar + authentication layer. +- You have custom authentication middleware on your self-hosted Toolbox server. + +Without proper client authentication in these scenarios, attempts to connect or +make calls (like `load_tool`) will likely fail with `Unauthorized` errors. + +### How it works + +The `ToolboxClient` (and `ToolboxSyncClient`) allows you to specify functions +(or coroutines for the async client) that dynamically generate HTTP headers for +every request sent to the Toolbox server. The most common use case is to add an +Authorization header with a bearer token (e.g., a Google ID token). + +These header-generating functions are called just before each request, ensuring +that fresh credentials or header values can be used. + +### Configuration + +You can configure these dynamic headers as seen below: + +```python +from toolbox_core import ToolboxClient + +async with ToolboxClient("toolbox-url", client_headers={"header1": header1_getter, "header2": header2_getter, ...}) as client: + # Use client + pass +``` + +### Authenticating with Google Cloud Servers + +For Toolbox servers hosted on Google Cloud (e.g., Cloud Run) and requiring +`Google ID token` authentication, the helper module +[auth_methods](https://github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-core/src/toolbox_core/auth_methods.py) provides utility functions. + +### Step by Step Guide for Cloud Run + +1. **Configure Permissions**: [Grant](https://cloud.google.com/run/docs/securing/managing-access#service-add-principals) the `roles/run.invoker` IAM role on the Cloud + Run service to the principal. This could be your `user account email` or a + `service account`. +2. **Configure Credentials** + - Local Development: Set up + [ADC](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment). + - Google Cloud Environments: When running within Google Cloud (e.g., Compute + Engine, GKE, another Cloud Run service, Cloud Functions), ADC is typically + configured automatically, using the environment's default service account. +3. **Connect to the Toolbox Server** + + ```python + from toolbox_core import auth_methods + + auth_token_provider = auth_methods.aget_google_id_token(URL) # can also use sync method + async with ToolboxClient( + URL, + client_headers={"Authorization": auth_token_provider}, + ) as client: + tools = await client.load_toolset() + + # Now, you can use the client as usual. + ``` + +## Authenticating Tools + +{{< notice info >}} +**Always use HTTPS** to connect your application with the Toolbox service, especially in **production environments** or whenever the communication involves **sensitive data** (including scenarios where tools require authentication tokens). Using plain HTTP lacks encryption and exposes your application and data to significant security risks, such as eavesdropping and tampering. +{{
}} + +Tools can be configured within the Toolbox service to require authentication, +ensuring only authorized users or applications can invoke them, especially when +accessing sensitive data. + +### When is Authentication Needed? + +Authentication is configured per-tool within the Toolbox service itself. If a +tool you intend to use is marked as requiring authentication in the service, you +must configure the SDK client to provide the necessary credentials (currently +Oauth2 tokens) when invoking that specific tool. + +### Supported Authentication Mechanisms + +The Toolbox service enables secure tool usage through **Authenticated Parameters**. For detailed information on how these mechanisms work within the Toolbox service and how to configure them, please refer to [Authenticated Parameters](../../../../configuration/tools/_index.md#authenticated-parameters) + +### Step 1: Configure Tools in Toolbox Service + +First, ensure the target tool(s) are configured correctly in the Toolbox service +to require authentication. Refer to the [Authenticated Parameters](../../../../configuration/tools/_index.md#authenticated-parameters) +for instructions. + +### Step 2: Configure SDK Client + +Your application needs a way to obtain the required Oauth2 token for the +authenticated user. The SDK requires you to provide a function capable of +retrieving this token *when the tool is invoked*. + +#### Provide an ID Token Retriever Function + +You must provide the SDK with a function (sync or async) that returns the +necessary token when called. The implementation depends on your application's +authentication flow (e.g., retrieving a stored token, initiating an OAuth flow). + +{{< notice info>}} +The name used when registering the getter function with the SDK (e.g.,`"my_api_token"`) must exactly match the `name` of the corresponding `authServices` defined in the tool's configuration within the Toolbox service. +{{}} + +```py +async def get_auth_token(): + # ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + # This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" # Placeholder +``` + +{{< notice tip>}} +Your token retriever function is invoked every time an authenticated parameter requires a token for a tool call. Consider implementing caching logic within this function to avoid redundant token fetching or generation, especially for tokens with longer validity periods or if the retrieval process is resource-intensive. +{{}} + +#### Option A: Add Authentication to a Loaded Tool + +You can add the token retriever function to a tool object *after* it has been +loaded. This modifies the specific tool instance. + +```py +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tool = await toolbox.load_tool("my-tool") + + auth_tool = tool.add_auth_token_getter("my_auth", get_auth_token) # Single token + + # OR + + multi_auth_tool = tool.add_auth_token_getters({ + "my_auth_1": get_auth_token_1, + "my_auth_2": get_auth_token_2, + }) # Multiple tokens +``` + +#### Option B: Add Authentication While Loading Tools + +You can provide the token retriever(s) directly during the `load_tool` or +`load_toolset` calls. This applies the authentication configuration only to the +tools loaded in that specific call, without modifying the original tool objects +if they were loaded previously. + +```py +auth_tool = await toolbox.load_tool(auth_token_getters={"my_auth": get_auth_token}) + +# OR + +auth_tools = await toolbox.load_toolset(auth_token_getters={"my_auth": get_auth_token}) +``` + +{{< notice >}} +Adding auth tokens during loading only affect the tools loaded within that call. +{{}} + +### Complete Authentication Example + +```py +import asyncio +from toolbox_core import ToolboxClient + +async def get_auth_token(): + # ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + # This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" # Placeholder + +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tool = await toolbox.load_tool("my-tool") + + auth_tool = tool.add_auth_token_getters({"my_auth": get_auth_token}) + result = auth_tool(input="some input") + print(result) +``` + +{{< notice >}} +An auth token getter for a specific name (e.g., `“GOOGLE_ID”`) will replace any client header with the same name followed by `“_token”` (e.g., `“GOOGLE_ID_token”`). +{{}} + + +## Parameter Binding + +The SDK allows you to pre-set, or "bind", values for specific tool parameters +before the tool is invoked or even passed to an LLM. These bound values are +fixed and will not be requested or modified by the LLM during tool use. + +### Why Bind Parameters? + +- **Protecting sensitive information:** API keys, secrets, etc. +- **Enforcing consistency:** Ensuring specific values for certain parameters. +- **Pre-filling known data:** Providing defaults or context. + +{{< notice info >}} +The parameter names used for binding (e.g., `"api_key"`) must exactly match the parameter names defined in the tool’s configuration within the Toolbox service. +{{}} + +{{< notice >}} +You do not need to modify the tool’s configuration in the Toolbox service to bind parameter values using the SDK. +{{}} + +### Option A: Binding Parameters to a Loaded Tool + +Bind values to a tool object *after* it has been loaded. This modifies the +specific tool instance. + +```py +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tool = await toolbox.load_tool("my-tool") + + bound_tool = tool.bind_param("param", "value") + + # OR + + bound_tool = tool.bind_params({"param": "value"}) +``` + +### Option B: Binding Parameters While Loading Tools + +Specify bound parameters directly when loading tools. This applies the binding +only to the tools loaded in that specific call. + +```py +bound_tool = await toolbox.load_tool("my-tool", bound_params={"param": "value"}) + +# OR + +bound_tools = await toolbox.load_toolset(bound_params={"param": "value"}) +``` + +### Binding Dynamic Values + +Instead of a static value, you can bind a parameter to a synchronous or +asynchronous function. This function will be called *each time* the tool is +invoked to dynamically determine the parameter's value at runtime. + +{{< notice >}} + You don’t need to modify tool configurations to bind parameter values. +{{}} + +```py +async def get_dynamic_value(): + # Logic to determine the value + return "dynamic_value" + +# Assuming `tool` is a loaded tool instance from a ToolboxClient +dynamic_bound_tool = tool.bind_param("param", get_dynamic_value) +``` diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/langchain/index.md b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/langchain/index.md new file mode 100644 index 000000000000..86a9763bb73f --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/langchain/index.md @@ -0,0 +1,452 @@ +--- +title: "LangChain/LangGraph" +type: docs +weight: 3 +description: > + MCP Toolbox SDK for integrating functionalities of MCP Toolbox into your LangChain/LangGraph apps. +--- + +## Overview + +The `toolbox-langchain` package provides a Python interface to the MCP Toolbox service, enabling you to load and invoke tools from your own applications. + +## Installation + +```bash +pip install toolbox-langchain +``` +## Quickstart + +Here's a minimal example to get you started using +[LangGraph](https://langchain-ai.github.io/langgraph/reference/prebuilt/#langgraph.prebuilt.chat_agent_executor.create_react_agent): + +```py +from toolbox_langchain import ToolboxClient +from langchain_google_vertexai import ChatVertexAI +from langgraph.prebuilt import create_react_agent + +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tools = toolbox.load_toolset() + + model = ChatVertexAI(model="gemini-3-flash-preview") + agent = create_react_agent(model, tools) + + prompt = "How's the weather today?" + + for s in agent.stream({"messages": [("user", prompt)]}, stream_mode="values"): + message = s["messages"][-1] + if isinstance(message, tuple): + print(message) + else: + message.pretty_print() +``` +{{< notice tip >}} +For a complete, end-to-end example including setting up the service and using an SDK, see the full tutorial: [Toolbox Quickstart Tutorial](../../../../getting-started/local_quickstart.md) +{{< /notice >}} + +## Usage + +Import and initialize the toolbox client. + +```py +from toolbox_langchain import ToolboxClient + +# Replace with your Toolbox service's URL +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: +``` + +## Transport Protocols + +The SDK supports multiple transport protocols for communicating with the Toolbox server. By default, the client uses the latest supported version of the **Model Context Protocol (MCP)**. + +You can explicitly select a protocol using the `protocol` option during client initialization. This is useful if you need to use the native Toolbox HTTP protocol or pin the client to a specific legacy version of MCP. + +{{< notice note >}} +* **Native Toolbox Transport**: This uses the service's native **REST over HTTP** API. +* **MCP Transports**: These options use the **Model Context Protocol over HTTP**. +{{< /notice >}} + +### Supported Protocols + +| Constant | Description | +| :--- | :--- | +| `Protocol.MCP` | **(Default)** Alias for the default MCP version (currently `2025-06-18`). | +| `Protocol.TOOLBOX` | **DEPRECATED**: The native Toolbox HTTP protocol. Will be removed on March 4, 2026. | +| `Protocol.MCP_v20251125` | MCP Protocol version 2025-11-25. | +| `Protocol.MCP_v20250618` | MCP Protocol version 2025-06-18. | +| `Protocol.MCP_v20250326` | MCP Protocol version 2025-03-26. | +| `Protocol.MCP_v20241105` | MCP Protocol version 2024-11-05. | + +{{< notice note >}} +The **Native Toolbox Protocol** (`Protocol.TOOLBOX`) is deprecated and will be removed on **March 4, 2026**. +Please migrate to using the **MCP Protocol** (`Protocol.MCP`), which is the default. +{{< /notice >}} + +### Example + +If you wish to use the native Toolbox protocol: + +```py +from toolbox_langchain import ToolboxClient +from toolbox_core.protocol import Protocol + +async with ToolboxClient("http://127.0.0.1:5000", protocol=Protocol.TOOLBOX) as toolbox: + # Use client + pass +``` + +If you want to pin the MCP Version 2025-03-26: + +```py +from toolbox_langchain import ToolboxClient +from toolbox_core.protocol import Protocol + +async with ToolboxClient("http://127.0.0.1:5000", protocol=Protocol.MCP_v20250326) as toolbox: + # Use client + pass +``` + +## Loading Tools + +### Load a toolset + +A toolset is a collection of related tools. You can load all tools in a toolset +or a specific one: + +```py +# Load all tools +tools = toolbox.load_toolset() + +# Load a specific toolset +tools = toolbox.load_toolset("my-toolset") +``` + +### Load a single tool + +```py +tool = toolbox.load_tool("my-tool") +``` + +Loading individual tools gives you finer-grained control over which tools are +available to your LLM agent. + +## Use with LangChain + +LangChain's agents can dynamically choose and execute tools based on the user +input. Include tools loaded from the Toolbox SDK in the agent's toolkit: + +```py +from langchain_google_vertexai import ChatVertexAI + +model = ChatVertexAI(model="gemini-3-flash-preview") + +# Initialize agent with tools +agent = model.bind_tools(tools) + +# Run the agent +result = agent.invoke("Do something with the tools") +``` + +## Use with LangGraph + +Integrate the Toolbox SDK with LangGraph to use Toolbox service tools within a +graph-based workflow. Follow the [official +guide](https://langchain-ai.github.io/langgraph/) with minimal changes. + +### Represent Tools as Nodes + +Represent each tool as a LangGraph node, encapsulating the tool's execution within the node's functionality: + +```py +from toolbox_langchain import ToolboxClient +from langgraph.graph import StateGraph, MessagesState +from langgraph.prebuilt import ToolNode + +# Define the function that calls the model +def call_model(state: MessagesState): + messages = state['messages'] + response = model.invoke(messages) + return {"messages": [response]} # Return a list to add to existing messages + +model = ChatVertexAI(model="gemini-3-flash-preview") +builder = StateGraph(MessagesState) +tool_node = ToolNode(tools) + +builder.add_node("agent", call_model) +builder.add_node("tools", tool_node) +``` + +### Connect Tools with LLM + +Connect tool nodes with LLM nodes. The LLM decides which tool to use based on +input or context. Tool output can be fed back into the LLM: + +```py +from typing import Literal +from langgraph.graph import END, START +from langchain_core.messages import HumanMessage + +# Define the function that determines whether to continue or not +def should_continue(state: MessagesState) -> Literal["tools", END]: + messages = state['messages'] + last_message = messages[-1] + if last_message.tool_calls: + return "tools" # Route to "tools" node if LLM makes a tool call + return END # Otherwise, stop + +builder.add_edge(START, "agent") +builder.add_conditional_edges("agent", should_continue) +builder.add_edge("tools", 'agent') + +graph = builder.compile() + +graph.invoke({"messages": [HumanMessage(content="Do something with the tools")]}) +``` + +## Manual usage + +Execute a tool manually using the `invoke` method: + +```py +result = tools[0].invoke({"name": "Alice", "age": 30}) +``` + +This is useful for testing tools or when you need precise control over tool +execution outside of an agent framework. + +## Client to Server Authentication + +This section describes how to authenticate the ToolboxClient itself when +connecting to a Toolbox server instance that requires authentication. This is +crucial for securing your Toolbox server endpoint, especially when deployed on +platforms like Cloud Run, GKE, or any environment where unauthenticated access +is restricted. + +This client-to-server authentication ensures that the Toolbox server can verify +the identity of the client making the request before any tool is loaded or +called. It is different from [Authenticating Tools](#authenticating-tools), +which deals with providing credentials for specific tools within an already +connected Toolbox session. + +### When is Client-to-Server Authentication Needed? + +You'll need this type of authentication if your Toolbox server is configured to +deny unauthenticated requests. For example: + +- Your Toolbox server is deployed on Cloud Run and configured to "Require authentication." +- Your server is behind an Identity-Aware Proxy (IAP) or a similar + authentication layer. +- You have custom authentication middleware on your self-hosted Toolbox server. + +Without proper client authentication in these scenarios, attempts to connect or +make calls (like `load_tool`) will likely fail with `Unauthorized` errors. + +### How it works + +The `ToolboxClient` allows you to specify functions (or coroutines for the async +client) that dynamically generate HTTP headers for every request sent to the +Toolbox server. The most common use case is to add an Authorization header with +a bearer token (e.g., a Google ID token). + +These header-generating functions are called just before each request, ensuring +that fresh credentials or header values can be used. + +### Configuration + +You can configure these dynamic headers as follows: + +```python +from toolbox_langchain import ToolboxClient + +async with ToolboxClient( + "toolbox-url", + client_headers={"header1": header1_getter, "header2": header2_getter, ...} +) as client: +``` + +### Authenticating with Google Cloud Servers + +For Toolbox servers hosted on Google Cloud (e.g., Cloud Run) and requiring +`Google ID token` authentication, the helper module +[auth_methods](https://github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-core/src/toolbox_core/auth_methods.py) provides utility functions. + +### Step by Step Guide for Cloud Run + +1. **Configure Permissions**: + [Grant](https://cloud.google.com/run/docs/securing/managing-access#service-add-principals) + the `roles/run.invoker` IAM role on the Cloud + Run service to the principal. This could be your `user account email` or a + `service account`. +2. **Configure Credentials** + - Local Development: Set up + [ADC](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment). + - Google Cloud Environments: When running within Google Cloud (e.g., Compute + Engine, GKE, another Cloud Run service, Cloud Functions), ADC is typically + configured automatically, using the environment's default service account. +3. **Connect to the Toolbox Server** + + ```python + from toolbox_langchain import ToolboxClient + from toolbox_core import auth_methods + + auth_token_provider = auth_methods.aget_google_id_token(URL) # can also use sync method + async with ToolboxClient( + URL, + client_headers={"Authorization": auth_token_provider}, + ) as client: + tools = client.load_toolset() + + # Now, you can use the client as usual. + ``` + + +## Authenticating Tools + +{{< notice info >}} +Always use HTTPS to connect your application with the Toolbox service, especially when using tools with authentication configured. Using HTTP exposes your application to serious security risks. +{{< /notice >}} + +Some tools require user authentication to access sensitive data. + +### Supported Authentication Mechanisms +Toolbox currently supports authentication using the [OIDC +protocol](https://openid.net/specs/openid-connect-core-1_0.html) with [ID +tokens](https://openid.net/specs/openid-connect-core-1_0.html#IDToken) (not +access tokens) for [Google OAuth +2.0](https://cloud.google.com/apigee/docs/api-platform/security/oauth/oauth-home). + +### Configure Tools + +Refer to [these +instructions](../../../../configuration/tools/_index.md#authenticated-parameters) on +configuring tools for authenticated parameters. + +### Configure SDK + +You need a method to retrieve an ID token from your authentication service: + +```py +async def get_auth_token(): + # ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + # This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" # Placeholder +``` + +#### Add Authentication to a Tool + +```py +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tools = toolbox.load_toolset() + + auth_tool = tools[0].add_auth_token_getter("my_auth", get_auth_token) # Single token + + multi_auth_tool = tools[0].add_auth_token_getters({"auth_1": get_auth_1}, {"auth_2": get_auth_2}) # Multiple tokens + + # OR + + auth_tools = [tool.add_auth_token_getter("my_auth", get_auth_token) for tool in tools] +``` + +#### Add Authentication While Loading + +```py +auth_tool = toolbox.load_tool(auth_token_getters={"my_auth": get_auth_token}) + +auth_tools = toolbox.load_toolset(auth_token_getters={"my_auth": get_auth_token}) +``` +{{< notice note >}} +Adding auth tokens during loading only affect the tools loaded within that call. +{{< /notice >}} + +### Complete Example + +```py +import asyncio +from toolbox_langchain import ToolboxClient + +async def get_auth_token(): + # ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + # This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" # Placeholder + +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tool = toolbox.load_tool("my-tool") + + auth_tool = tool.add_auth_token_getter("my_auth", get_auth_token) + result = auth_tool.invoke({"input": "some input"}) + print(result) +``` + +## Parameter Binding + +Predetermine values for tool parameters using the SDK. These values won't be +modified by the LLM. This is useful for: + +* **Protecting sensitive information:** API keys, secrets, etc. +* **Enforcing consistency:** Ensuring specific values for certain parameters. +* **Pre-filling known data:** Providing defaults or context. + +### Binding Parameters to a Tool + +```py +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tools = toolbox.load_toolset() + + bound_tool = tool[0].bind_param("param", "value") # Single param + + multi_bound_tool = tools[0].bind_params({"param1": "value1", "param2": "value2"}) # Multiple params + + # OR + + bound_tools = [tool.bind_param("param", "value") for tool in tools] +``` + +### Binding Parameters While Loading + +```py +bound_tool = toolbox.load_tool("my-tool", bound_params={"param": "value"}) + +bound_tools = toolbox.load_toolset(bound_params={"param": "value"}) +``` +{{< notice note >}} +Bound values during loading only affect the tools loaded in that call. +{{< /notice >}} + +### Binding Dynamic Values + +Use a function to bind dynamic values: + +```py +def get_dynamic_value(): + # Logic to determine the value + return "dynamic_value" + +dynamic_bound_tool = tool.bind_param("param", get_dynamic_value) +``` +{{< notice note >}} +You don’t need to modify tool configurations to bind parameter values. +{{< /notice >}} + +## Asynchronous Usage + +For better performance through [cooperative +multitasking](https://en.wikipedia.org/wiki/Cooperative_multitasking), you can +use the asynchronous interfaces of the `ToolboxClient`. + +{{< notice note >}} +Asynchronous interfaces like `aload_tool` and `aload_toolset` require an asynchronous environment. For guidance on running asynchronous Python programs, see [asyncio documentation](https://docs.python.org/3/library/asyncio-runner.html#running-an-asyncio-program). +{{< /notice >}} + +```py +import asyncio +from toolbox_langchain import ToolboxClient + +async def main(): + async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tool = await client.aload_tool("my-tool") + tools = await client.aload_toolset() + response = await tool.ainvoke() + +if __name__ == "__main__": + asyncio.run(main()) +``` diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/llamaindex/index.md b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/llamaindex/index.md new file mode 100644 index 000000000000..f2b1c58b4044 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/llamaindex/index.md @@ -0,0 +1,437 @@ +--- +title: "LlamaIndex" +type: docs +weight: 4 +description: > + MCP Toolbox LlamaIndex SDK for integrating functionalities of MCP Toolbox into your LlamaIndex apps. +--- + +## Overview + +The `toolbox-llamaindex` package provides a Python interface to the MCP Toolbox service, enabling you to load and invoke tools from your own applications. + +## Installation + +```bash +pip install toolbox-llamaindex +``` + +## Quickstart + +Here's a minimal example to get you started using +[LlamaIndex](https://docs.llamaindex.ai/en/stable/#getting-started): + +```py +import asyncio + +from llama_index.llms.google_genai import GoogleGenAI +from llama_index.core.agent.workflow import AgentWorkflow + +from toolbox_llamaindex import ToolboxClient + +async def run_agent(): + async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tools = toolbox.load_toolset() + + vertex_model = GoogleGenAI( + model="gemini-3-flash-preview", + vertexai_config={"project": "project-id", "location": "us-central1"}, + ) + agent = AgentWorkflow.from_tools_or_functions( + tools, + llm=vertex_model, + system_prompt="You are a helpful assistant.", + ) + response = await agent.run(user_msg="Get some response from the agent.") + print(response) + +asyncio.run(run_agent()) +``` + +{{< notice tip >}} +For a complete, end-to-end example including setting up the service and using an SDK, see the full tutorial: [Toolbox Quickstart Tutorial](../../../../getting-started/local_quickstart.md) +{{< /notice >}} + +## Usage + +Import and initialize the toolbox client. + +```py +from toolbox_llamaindex import ToolboxClient + +# Replace with your Toolbox service's URL +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: +``` + +## Transport Protocols + +The SDK supports multiple transport protocols for communicating with the Toolbox server. By default, the client uses the latest supported version of the **Model Context Protocol (MCP)**. + +You can explicitly select a protocol using the `protocol` option during client initialization. This is useful if you need to use the native Toolbox HTTP protocol or pin the client to a specific legacy version of MCP. + +{{< notice note >}} +* **Native Toolbox Transport**: This uses the service's native **REST over HTTP** API. +* **MCP Transports**: These options use the **Model Context Protocol over HTTP**. +{{< /notice >}} + +### Supported Protocols + +| Constant | Description | +| :--- | :--- | +| `Protocol.MCP` | **(Default)** Alias for the default MCP version (currently `2025-06-18`). | +| `Protocol.TOOLBOX` | **DEPRECATED**: The native Toolbox HTTP protocol. Will be removed on March 4, 2026. | +| `Protocol.MCP_v20251125` | MCP Protocol version 2025-11-25. | +| `Protocol.MCP_v20250618` | MCP Protocol version 2025-06-18. | +| `Protocol.MCP_v20250326` | MCP Protocol version 2025-03-26. | +| `Protocol.MCP_v20241105` | MCP Protocol version 2024-11-05. | + +{{< notice note >}} +The **Native Toolbox Protocol** (`Protocol.TOOLBOX`) is deprecated and will be removed on **March 4, 2026**. +Please migrate to using the **MCP Protocol** (`Protocol.MCP`), which is the default. +{{< /notice >}} + +### Example + +If you wish to use the native Toolbox protocol: + +```py +from toolbox_llamaindex import ToolboxClient +from toolbox_core.protocol import Protocol + +async with ToolboxClient("http://127.0.0.1:5000", protocol=Protocol.TOOLBOX) as toolbox: + # Use client + pass +``` + +If you want to pin the MCP Version 2025-03-26: + +```py +from toolbox_llamaindex import ToolboxClient +from toolbox_core.protocol import Protocol + +async with ToolboxClient("http://127.0.0.1:5000", protocol=Protocol.MCP_v20250326) as toolbox: + # Use client + pass +``` + +## Loading Tools + +### Load a toolset + +A toolset is a collection of related tools. You can load all tools in a toolset +or a specific one: + +```py +# Load all tools +tools = toolbox.load_toolset() + +# Load a specific toolset +tools = toolbox.load_toolset("my-toolset") +``` + +### Load a single tool + +```py +tool = toolbox.load_tool("my-tool") +``` + +Loading individual tools gives you finer-grained control over which tools are +available to your LLM agent. + +## Use with LlamaIndex + +LlamaIndex's agents can dynamically choose and execute tools based on the user +input. Include tools loaded from the Toolbox SDK in the agent's toolkit: + +```py +from llama_index.llms.google_genai import GoogleGenAI +from llama_index.core.agent.workflow import AgentWorkflow + +vertex_model = GoogleGenAI( + model="gemini-3-flash-preview", + vertexai_config={"project": "project-id", "location": "us-central1"}, +) + +# Initialize agent with tools +agent = AgentWorkflow.from_tools_or_functions( + tools, + llm=vertex_model, + system_prompt="You are a helpful assistant.", +) + +# Query the agent +response = await agent.run(user_msg="Get some response from the agent.") +print(response) +``` + +### Maintain state + +To maintain state for the agent, add context as follows: + +```py +from llama_index.core.agent.workflow import AgentWorkflow +from llama_index.core.workflow import Context +from llama_index.llms.google_genai import GoogleGenAI + +vertex_model = GoogleGenAI( + model="gemini-3-flash-preview", + vertexai_config={"project": "project-id", "location": "us-central1"}, +) +agent = AgentWorkflow.from_tools_or_functions( + tools, + llm=vertex_model, + system_prompt="You are a helpful assistant.", +) + +# Save memory in agent context +ctx = Context(agent) +response = await agent.run(user_msg="Give me some response.", ctx=ctx) +print(response) +``` + +## Manual usage + +Execute a tool manually using the `call` method: + +```py +result = tools[0].call(name="Alice", age=30) +``` + +This is useful for testing tools or when you need precise control over tool +execution outside of an agent framework. + +## Client to Server Authentication + +This section describes how to authenticate the ToolboxClient itself when +connecting to a Toolbox server instance that requires authentication. This is +crucial for securing your Toolbox server endpoint, especially when deployed on +platforms like Cloud Run, GKE, or any environment where unauthenticated access is restricted. + +This client-to-server authentication ensures that the Toolbox server can verify +the identity of the client making the request before any tool is loaded or +called. It is different from [Authenticating Tools](#authenticating-tools), +which deals with providing credentials for specific tools within an already +connected Toolbox session. + +### When is Client-to-Server Authentication Needed? + +You'll need this type of authentication if your Toolbox server is configured to +deny unauthenticated requests. For example: + +- Your Toolbox server is deployed on Cloud Run and configured to "Require authentication." +- Your server is behind an Identity-Aware Proxy (IAP) or a similar + authentication layer. +- You have custom authentication middleware on your self-hosted Toolbox server. + +Without proper client authentication in these scenarios, attempts to connect or +make calls (like `load_tool`) will likely fail with `Unauthorized` errors. + +### How it works + +The `ToolboxClient` allows you to specify functions (or coroutines for the async +client) that dynamically generate HTTP headers for every request sent to the +Toolbox server. The most common use case is to add an Authorization header with +a bearer token (e.g., a Google ID token). + +These header-generating functions are called just before each request, ensuring +that fresh credentials or header values can be used. + +### Configuration + +You can configure these dynamic headers as follows: + +```python +from toolbox_llamaindex import ToolboxClient + +async with ToolboxClient( + "toolbox-url", + client_headers={"header1": header1_getter, "header2": header2_getter}, +) as client: +``` + +### Authenticating with Google Cloud Servers + +For Toolbox servers hosted on Google Cloud (e.g., Cloud Run) and requiring +`Google ID token` authentication, the helper module +[auth_methods](https://github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-core/src/toolbox_core/auth_methods.py) provides utility functions. + +### Step by Step Guide for Cloud Run + +1. **Configure Permissions**: [Grant](https://cloud.google.com/run/docs/securing/managing-access#service-add-principals) the `roles/run.invoker` IAM role on the Cloud + Run service to the principal. This could be your `user account email` or a + `service account`. +2. **Configure Credentials** + - Local Development: Set up + [ADC](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment). + - Google Cloud Environments: When running within Google Cloud (e.g., Compute + Engine, GKE, another Cloud Run service, Cloud Functions), ADC is typically + configured automatically, using the environment's default service account. +3. **Connect to the Toolbox Server** + + ```python + from toolbox_llamaindex import ToolboxClient + from toolbox_core import auth_methods + + auth_token_provider = auth_methods.aget_google_id_token(URL) + async with ToolboxClient( + URL, + client_headers={"Authorization": auth_token_provider}, + ) as client: + tools = await client.aload_toolset() + + # Now, you can use the client as usual. + ``` + +## Authenticating Tools + +{{< notice info >}} +Always use HTTPS to connect your application with the Toolbox service, especially when using tools with authentication configured. Using HTTP exposes your application to serious security risks. +{{< /notice >}} + +Some tools require user authentication to access sensitive data. + +### Supported Authentication Mechanisms +Toolbox currently supports authentication using the [OIDC +protocol](https://openid.net/specs/openid-connect-core-1_0.html) with [ID +tokens](https://openid.net/specs/openid-connect-core-1_0.html#IDToken) (not +access tokens) for [Google OAuth +2.0](https://cloud.google.com/apigee/docs/api-platform/security/oauth/oauth-home). + +### Configure Tools + +Refer to [these +instructions](../../../../configuration/tools/_index.md#authenticated-parameters) on +configuring tools for authenticated parameters. + +### Configure SDK + +You need a method to retrieve an ID token from your authentication service: + +```py +async def get_auth_token(): + # ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + # This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" # Placeholder +``` + +#### Add Authentication to a Tool + +```py +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tools = toolbox.load_toolset() + + auth_tool = tools[0].add_auth_token_getter("my_auth", get_auth_token) # Single token + + multi_auth_tool = tools[0].add_auth_token_getters({"auth_1": get_auth_1}, {"auth_2": get_auth_2}) # Multiple tokens + + # OR + + auth_tools = [tool.add_auth_token_getter("my_auth", get_auth_token) for tool in tools] +``` + +#### Add Authentication While Loading + +```py +auth_tool = toolbox.load_tool(auth_token_getters={"my_auth": get_auth_token}) + +auth_tools = toolbox.load_toolset(auth_token_getters={"my_auth": get_auth_token}) +``` + +{{< notice note >}} +Adding auth tokens during loading only affect the tools loaded within that call. +{{< /notice >}} + +### Complete Example + +```py +import asyncio +from toolbox_llamaindex import ToolboxClient + +async def get_auth_token(): + # ... Logic to retrieve ID token (e.g., from local storage, OAuth flow) + # This example just returns a placeholder. Replace with your actual token retrieval. + return "YOUR_ID_TOKEN" # Placeholder + +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tool = toolbox.load_tool("my-tool") + + auth_tool = tool.add_auth_token_getter("my_auth", get_auth_token) + result = auth_tool.call(input="some input") + print(result) +``` + +## Parameter Binding + +Predetermine values for tool parameters using the SDK. These values won't be +modified by the LLM. This is useful for: + +* **Protecting sensitive information:** API keys, secrets, etc. +* **Enforcing consistency:** Ensuring specific values for certain parameters. +* **Pre-filling known data:** Providing defaults or context. + +### Binding Parameters to a Tool + +```py +async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tools = toolbox.load_toolset() + + bound_tool = tool[0].bind_param("param", "value") # Single param + + multi_bound_tool = tools[0].bind_params({"param1": "value1", "param2": "value2"}) # Multiple params + + # OR + + bound_tools = [tool.bind_param("param", "value") for tool in tools] +``` + +### Binding Parameters While Loading + +```py +bound_tool = toolbox.load_tool("my-tool", bound_params={"param": "value"}) + +bound_tools = toolbox.load_toolset(bound_params={"param": "value"}) +``` + +{{< notice note >}} +Bound values during loading only affect the tools loaded in that call. +{{< /notice >}} + +### Binding Dynamic Values + +Use a function to bind dynamic values: + +```py +def get_dynamic_value(): + # Logic to determine the value + return "dynamic_value" + +dynamic_bound_tool = tool.bind_param("param", get_dynamic_value) +``` + +{{< notice note >}} +You don't need to modify tool configurations to bind parameter values. +{{< /notice >}} + +## Asynchronous Usage + +For better performance through [cooperative +multitasking](https://en.wikipedia.org/wiki/Cooperative_multitasking), you can +use the asynchronous interfaces of the `ToolboxClient`. + +{{< notice note >}} +Asynchronous interfaces like `aload_tool` and `aload_toolset` require an asynchronous environment. For guidance on running asynchronous Python programs, see [asyncio documentation](https://docs.python.org/3/library/asyncio-runner.html#running-an-asyncio-program). +{{< /notice >}} + +```py +import asyncio +from toolbox_llamaindex import ToolboxClient + +async def main(): + async with ToolboxClient("http://127.0.0.1:5000") as toolbox: + tool = await client.aload_tool("my-tool") + tools = await client.aload_toolset() + response = await tool.ainvoke() + +if __name__ == "__main__": + asyncio.run(main()) +``` diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/__init__.py b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/__init__.py new file mode 100644 index 000000000000..f5b7c1bfd25c --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/__init__.py @@ -0,0 +1,19 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# This file makes the 'pre_post_processing/python' directory a Python package. + +# You can include any package-level initialization logic here if needed. +# For now, this file is empty. diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/_index.md b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/_index.md new file mode 100644 index 000000000000..1c65e26dfa33 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/_index.md @@ -0,0 +1,51 @@ +--- +title: "Python: Pre & Post Processing" +type: docs +weight: 5 +description: > + How to add pre- and post- processing to your Agents using Python. +sample_filters: ["Pre & Post Processing", "Python", "ADK", "LangChain"] +is_sample: true +--- + +## Prerequisites + +This tutorial assumes that you have set up MCP Toolbox with a basic agent as described in the [local quickstart](../../../../getting-started/local_quickstart.md). + +This guide demonstrates how to implement these patterns in your Toolbox applications. + +## Implementation + +{{< tabpane persist=header >}} +{{% tab header="ADK" text=true %}} +The following example demonstrates how to use `ToolboxToolset` with ADK's pre and post processing hooks to implement pre and post processing for tool calls. + +```py +{{< include "python/adk/agent.py" >}} +``` +You can also add model-level (`before_model_callback`, `after_model_callback`) and agent-level (`before_agent_callback`, `after_agent_callback`) hooks to intercept messages at different stages of the execution loop. + +For more information, see the [ADK Callbacks documentation](https://google.github.io/adk-docs/callbacks/types-of-callbacks/). +{{% /tab %}} +{{% tab header="Langchain" text=true %}} +The following example demonstrates how to use `ToolboxClient` with LangChain's middleware to implement pre- and post- processing for tool calls. + +{{< include "python/langchain/agent.py" "python" >}} + +You can also add model-level (`wrap_model`) and agent-level (`before_agent`, `after_agent`) hooks to intercept messages at different stages of the execution loop. See the [LangChain Middleware documentation](https://docs.langchain.com/oss/python/langchain/middleware/custom#wrap-style-hooks) for details on these additional hook types. +{{% /tab %}} +{{< /tabpane >}} + +## Results + +The output should look similar to the following. + +{{< notice note >}} +The exact responses may vary due to the non-deterministic nature of LLMs and differences between orchestration frameworks. +{{< /notice >}} + +``` +AI: Booking Confirmed! You earned 500 Loyalty Points with this stay. + +AI: Error: Maximum stay duration is 14 days. +``` diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/adk/agent.py b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/adk/agent.py new file mode 100644 index 000000000000..dfc847b36b1e --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/adk/agent.py @@ -0,0 +1,137 @@ +import asyncio +from datetime import datetime +from typing import Any, Dict, Optional +from copy import deepcopy + +from google.adk import Agent +from google.adk.apps import App +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.tools.tool_context import ToolContext +from google.genai import types +from toolbox_adk import CredentialStrategy, ToolboxToolset, ToolboxTool + +SYSTEM_PROMPT = """ + You're a helpful hotel assistant. You handle hotel searching, booking and + cancellations. When the user searches for a hotel, mention it's name, id, + location and price tier. Always mention hotel ids while performing any + searches. This is very important for any operations. For any bookings or + cancellations, please provide the appropriate confirmation. Be sure to + update checkin or checkout dates if mentioned by the user. + Don't ask for confirmations from the user. +""" + + +# Pre processing +async def enfore_business_rules( + tool: ToolboxTool, args: Dict[str, Any], tool_context: ToolContext +) -> Optional[Dict[str, Any]]: + """ + Callback fired before a tool is executed. + Enforces business logic: Max stay duration is 14 days. + """ + tool_name = tool.name + print(f"POLICY CHECK: Intercepting '{tool_name}'") + + if tool_name == "update-hotel" and "checkin_date" in args and "checkout_date" in args: + start = datetime.fromisoformat(args["checkin_date"]) + end = datetime.fromisoformat(args["checkout_date"]) + duration = (end - start).days + + if duration > 14: + print("BLOCKED: Stay too long") + return {"result": "Error: Maximum stay duration is 14 days."} + return None + + +# Post processing +async def enrich_response( + tool: ToolboxTool, + args: Dict[str, Any], + tool_context: ToolContext, + tool_response: Any, +) -> Optional[Any]: + """ + Callback fired after a tool execution. + Enriches response for successful bookings. + """ + if isinstance(tool_response, dict): + result = tool_response.get("result", "") + elif isinstance(tool_response, str): + result = tool_response + else: + return None + + tool_name = tool.name + if isinstance(result, str) and "Error" not in result: + if tool_name == "book-hotel": + loyalty_bonus = 500 + enriched_result = f"Booking Confirmed!\n You earned {loyalty_bonus} Loyalty Points with this stay.\n\nSystem Details: {result}" + + if isinstance(tool_response, dict): + modified_response = deepcopy(tool_response) + modified_response["result"] = enriched_result + return modified_response + else: + return enriched_result + return None + + +async def run_chat_turn( + runner: Runner, session_id: str, user_id: str, message_text: str +): + """Executes a single chat turn and prints the interaction.""" + print(f"\nUSER: '{message_text}'") + response_text = "" + async for event in runner.run_async( + user_id=user_id, + session_id=session_id, + new_message=types.Content(role="user", parts=[types.Part(text=message_text)]), + ): + if event.content and event.content.parts: + for part in event.content.parts: + if part.text: + response_text += part.text + + print(f"AI: {response_text}") + + +async def main(): + toolset = ToolboxToolset( + server_url="http://127.0.0.1:5000", + toolset_name="my-toolset", + credentials=CredentialStrategy.toolbox_identity(), + ) + tools = await toolset.get_tools() + root_agent = Agent( + name="root_agent", + model="gemini-2.5-flash", + instruction=SYSTEM_PROMPT, + tools=tools, + # add any pre and post processing callbacks + before_tool_callback=enfore_business_rules, + after_tool_callback=enrich_response, + ) + app = App(root_agent=root_agent, name="my_agent") + runner = Runner(app=app, session_service=InMemorySessionService()) + session_id = "test-session" + user_id = "test-user" + await runner.session_service.create_session( + app_name=app.name, user_id=user_id, session_id=session_id + ) + + # First turn: Successful booking + await run_chat_turn(runner, session_id, user_id, "Book hotel with id 3.") + print("-" * 50) + # Second turn: Policy violation (stay > 14 days) + await run_chat_turn( + runner, + session_id, + user_id, + "Book a hotel with id 5 with checkin date 2025-01-18 and checkout date 2025-02-10", + ) + await toolset.close() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/adk/requirements.txt b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/adk/requirements.txt new file mode 100644 index 000000000000..29e38e1f91b7 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/adk/requirements.txt @@ -0,0 +1,3 @@ +google-adk[toolbox]==1.23.0 +toolbox-adk==0.5.8 +google-genai==1.62.0 diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/agent_test.py b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/agent_test.py new file mode 100644 index 000000000000..36c5b8e27d07 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/agent_test.py @@ -0,0 +1,51 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import importlib +import os +from pathlib import Path + +import pytest + +ORCH_NAME = os.environ.get("ORCH_NAME") +module_path = f"python.{ORCH_NAME}.agent" +agent = importlib.import_module(module_path) + +GOLDEN_KEYWORDS = [ + "AI:", + "Loyalty Points", + "POLICY CHECK: Intercepting 'update-hotel'", +] + +# --- Execution Tests --- +class TestExecution: + """Test framework execution and output validation.""" + + @pytest.fixture(scope="function") + def script_output(self, capsys): + """Run the agent function and return its output.""" + asyncio.run(agent.main()) + return capsys.readouterr() + + def test_script_runs_without_errors(self, script_output): + """Test that the script runs and produces no stderr.""" + assert script_output.err == "", f"Script produced stderr: {script_output.err}" + + def test_keywords_in_output(self, script_output): + """Test that expected keywords are present in the script's output.""" + output = script_output.out + print(f"\nAgent Output:\n{output}\n") + missing_keywords = [kw for kw in GOLDEN_KEYWORDS if kw not in output] + assert not missing_keywords, f"Missing keywords in output: {missing_keywords}" diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/langchain/agent.py b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/langchain/agent.py new file mode 100644 index 000000000000..42b314ad1a64 --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/langchain/agent.py @@ -0,0 +1,116 @@ +import asyncio +from datetime import datetime + +from langchain.agents import create_agent +from langchain.agents.middleware import wrap_tool_call +from langchain_core.messages import ToolMessage +from langchain_google_vertexai import ChatVertexAI +from toolbox_langchain import ToolboxClient + +system_prompt = """ + You're a helpful hotel assistant. You handle hotel searching, booking and + cancellations. When the user searches for a hotel, mention it's name, id, + location and price tier. Always mention hotel ids while performing any + searches. This is very important for any operations. For any bookings or + cancellations, please provide the appropriate confirmation. Be sure to + update checkin or checkout dates if mentioned by the user. + Don't ask for confirmations from the user. +""" + + +# Pre processing +@wrap_tool_call +async def enforce_business_rules(request, handler): + """ + Business Logic Validation: + Enforces max stay duration (e.g., max 14 days). + """ + tool_call = request.tool_call + name = tool_call["name"] + args = tool_call["args"] + + print(f"POLICY CHECK: Intercepting '{name}'") + + if name == "update-hotel": + if "checkin_date" in args and "checkout_date" in args: + try: + start = datetime.fromisoformat(args["checkin_date"]) + end = datetime.fromisoformat(args["checkout_date"]) + duration = (end - start).days + + if duration > 14: + print("BLOCKED: Stay too long") + return ToolMessage( + content="Error: Maximum stay duration is 14 days.", + tool_call_id=tool_call["id"], + ) + except ValueError: + pass # Ignore invalid date formats + + # PRE: Code here runs BEFORE the tool execution + + # EXEC: Execute the tool (or next middleware) + result = await handler(request) + + # POST: Code here runs AFTER the tool execution + return result + + +# Post processing +@wrap_tool_call +async def enrich_response(request, handler): + """ + Post-Processing & Enrichment: + Adds loyalty points information to successful bookings. + Standardizes output format. + """ + # PRE: Code here runs BEFORE the tool execution + + # EXEC: Execute the tool (or next middleware) + result = await handler(request) + + # POST: Code here runs AFTER the tool execution + if isinstance(result, ToolMessage): + content = str(result.content) + tool_name = request.tool_call["name"] + + if tool_name == "book-hotel" and "Error" not in content: + loyalty_bonus = 500 + result.content = f"Booking Confirmed!\n You earned {loyalty_bonus} Loyalty Points with this stay.\n\nSystem Details: {content}" + + return result + + +async def main(): + async with ToolboxClient("http://127.0.0.1:5000") as client: + tools = await client.aload_toolset("my-toolset") + model = ChatVertexAI(model="gemini-2.5-flash") + agent = create_agent( + system_prompt=system_prompt, + model=model, + tools=tools, + # add any pre and post processing methods + middleware=[enforce_business_rules, enrich_response], + ) + # Test post-processing + user_input = "Book hotel with id 3." + response = await agent.ainvoke( + {"messages": [{"role": "user", "content": user_input}]} + ) + + print("-" * 50) + last_ai_msg = response["messages"][-1].content + print(f"AI: {last_ai_msg}") + + # Test Pre-processing + print("-" * 50) + user_input = "Update my hotel with id 3 with checkin date 2025-01-18 and checkout date 2025-02-20." + response = await agent.ainvoke( + {"messages": [{"role": "user", "content": user_input}]} + ) + last_ai_msg = response["messages"][-1].content + print(f"AI: {last_ai_msg}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/langchain/requirements.txt b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/langchain/requirements.txt new file mode 100644 index 000000000000..5638e0c1083a --- /dev/null +++ b/docs/en/documentation/connect-to/toolbox-sdks/python-sdk/pre-post-processing/langchain/requirements.txt @@ -0,0 +1,3 @@ +langchain==1.2.6 +langchain-google-vertexai==3.2.2 +toolbox-langchain==0.5.8 \ No newline at end of file diff --git a/docs/en/user-guide/deploy-to/_index.md b/docs/en/documentation/deploy-to/_index.md similarity index 100% rename from docs/en/user-guide/deploy-to/_index.md rename to docs/en/documentation/deploy-to/_index.md diff --git a/docs/en/user-guide/deploy-to/cloud-run/_index.md b/docs/en/documentation/deploy-to/cloud-run/_index.md similarity index 100% rename from docs/en/user-guide/deploy-to/cloud-run/_index.md rename to docs/en/documentation/deploy-to/cloud-run/_index.md diff --git a/docs/en/user-guide/deploy-to/docker/_index.md b/docs/en/documentation/deploy-to/docker/_index.md similarity index 97% rename from docs/en/user-guide/deploy-to/docker/_index.md rename to docs/en/documentation/deploy-to/docker/_index.md index a3435821ff64..2cf95f9e6cd6 100644 --- a/docs/en/user-guide/deploy-to/docker/_index.md +++ b/docs/en/documentation/deploy-to/docker/_index.md @@ -78,7 +78,7 @@ networks: {{< notice tip >}} You can use this setup to quickly set up Toolbox + Postgres to follow along in our -[Quickstart](../../../build-with-mcp-toolbox/local_quickstart.md) +[Quickstart](../../getting-started/local_quickstart.md) {{< /notice >}} diff --git a/docs/en/user-guide/deploy-to/kubernetes/_index.md b/docs/en/documentation/deploy-to/kubernetes/_index.md similarity index 100% rename from docs/en/user-guide/deploy-to/kubernetes/_index.md rename to docs/en/documentation/deploy-to/kubernetes/_index.md diff --git a/docs/en/user-guide/getting-started/_index.md b/docs/en/documentation/getting-started/_index.md similarity index 56% rename from docs/en/user-guide/getting-started/_index.md rename to docs/en/documentation/getting-started/_index.md index b55d4a5f45fa..f4e72bf54dda 100644 --- a/docs/en/user-guide/getting-started/_index.md +++ b/docs/en/documentation/getting-started/_index.md @@ -16,7 +16,7 @@ MCP Toolbox provides two main approaches for tools: **prebuilt** and **custom**. [**Prebuilt tools**](../configuration/prebuilt-configs/_index.md) are ready to use out of the box. For example, a tool like -[`postgres-execute-sql`](../../integrations/postgres/postgres-execute-sql.md) has fixed parameters +[`postgres-execute-sql`](../../integrations/postgres/tools/postgres-execute-sql.md) has fixed parameters and always works the same way, allowing the agent to execute arbitrary SQL. While these are convenient, they are typically only safe when a developer is in the loop (e.g., during prototyping, developing, or debugging). @@ -28,7 +28,7 @@ production is highly dangerous. To secure your application, you should [**use custom tools**](../configuration/tools/_index.md) to suit your specific schema and application needs. Creating a custom tool restricts the agent's capabilities to only what is necessary. For example, you can use the -[`postgres-sql`](../../integrations/postgres/postgres-sql.md) tool to define a specific action. This +[`postgres-sql`](../../integrations/postgres/tools/postgres-sql.md) tool to define a specific action. This typically involves: * **Prepared Statements:** Writing a SQL query ahead of time and letting the @@ -43,39 +43,24 @@ A key architectural benefit of the MCP Toolbox is flexibility in *how* and *when ### Build-Time In this model, the available tools and their schemas are established when the client initializes. * **How it works:** The client launches or connects to the MCP Toolbox server, reads the available tools once, and keeps them static for the session. -* **Best for:** **IDEs and CLI tools** +* [**Best for:** **IDEs and CLI tools**](../connect-to/_index.md) ### Runtime In this model, your application dynamically requests the latest tools from the Toolbox server on the fly. * **How it works:** Your application code actively calls the server at runtime to fetch the latest toolsets and their schemas. -* **Best for:** **AI Agents and Custom Applications**. +* [**Best for:** **AI Agents and Custom Applications**](../connect-to/_index.md) --- -## Usage Methodologies: How to Connect +## Connect using Being built on the Model Context Protocol (MCP), MCP Toolbox is framework-agnostic. You can connect to it in three main ways: -* **IDE Integrations:** Connect your local Toolbox server directly to MCP-compatible development environments. -* **CLI Tools:** Use command-line interfaces like the Gemini CLI to interact with your databases using natural language directly from your terminal. -* **Application Integration (Client SDKs):** If you are building custom AI agents, you can use our Client SDKs to pull tools directly into your application code. We provide native support for major orchestration frameworks including LangChain, LlamaIndex, Genkit, and more across Python, JavaScript/TypeScript, and Go. +* [**IDE Integrations:**](../connect-to/ides/_index.md) Connect your local Toolbox server directly to MCP-compatible development environments. +* [**CLI Tools:**](../connect-to/gemini-cli/_index.md) Use command-line interfaces like the Gemini CLI to interact with your databases using natural language directly from your terminal. +* [**MCP Client:**](../connect-to/mcp-client/_index.md) Connect to an MCP Client. +* [**Application Integration (Client SDKs):**](../connect-to/toolbox-sdks/_index.md) If you are building custom AI agents, you can use our Client SDKs to pull tools directly into your application code. We provide native support for major orchestration frameworks including LangChain, LlamaIndex, Genkit, and more across Python, JavaScript/TypeScript, and Go. --- -## Popular Quickstarts - -Ready to dive in? Here are some of the most popular paths to getting your first agent up and running: - -* [**Python SDK Quickstart:**](../../build-with-mcp-toolbox/local_quickstart.md) Build a custom agent from scratch using our native Python client. This is the go-to choice for developers wanting full control over their application logic and orchestration. - -* [**MCP Client Quickstart:**](../../build-with-mcp-toolbox/mcp_quickstart/_index.md) Plug your databases directly into the MCP ecosystem. Perfect for a setup that works instantly with existing MCP-compatible clients and various IDEs. - -{{< notice tip >}} -These are just a few starting points. For a complete list of tutorials, language-specific samples (Go, JS/TS, etc.), and advanced usage, explore the full [Build with MCP Toolbox section](../../build-with-mcp-toolbox/_index.md). -{{< /notice >}} - -## Next Steps - -Now that you understand the high-level concepts, it's time to build! - -Learn how to [configure your custom MCP Toolbox Server](../configuration/_index.md). +## Quickstarts diff --git a/docs/en/build-with-mcp-toolbox/colab_quickstart.ipynb b/docs/en/documentation/getting-started/colab_quickstart.ipynb similarity index 100% rename from docs/en/build-with-mcp-toolbox/colab_quickstart.ipynb rename to docs/en/documentation/getting-started/colab_quickstart.ipynb diff --git a/docs/en/build-with-mcp-toolbox/local_quickstart.md b/docs/en/documentation/getting-started/local_quickstart.md similarity index 97% rename from docs/en/build-with-mcp-toolbox/local_quickstart.md rename to docs/en/documentation/getting-started/local_quickstart.md index e5bc9e42fae7..938dd62b419e 100644 --- a/docs/en/build-with-mcp-toolbox/local_quickstart.md +++ b/docs/en/documentation/getting-started/local_quickstart.md @@ -1,10 +1,12 @@ --- title: "Python Quickstart (Local)" type: docs -weight: 1 +weight: 2 description: > How to get started running MCP Toolbox locally with [Python](https://github.com/googleapis/mcp-toolbox-sdk-python), PostgreSQL, and [Agent Development Kit](https://google.github.io/adk-docs/), [LangGraph](https://www.langchain.com/langgraph), [LlamaIndex](https://www.llamaindex.ai/) or [GoogleGenAI](https://pypi.org/project/google-genai/). +sample_filters: ["Python", "Quickstart", "Local", "ADK", "LangChain", "LlamaIndex", "Google GenAI"] +is_sample: true --- [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/googleapis/genai-toolbox/blob/main/docs/en/getting-started/colab_quickstart.ipynb) diff --git a/docs/en/build-with-mcp-toolbox/local_quickstart_go.md b/docs/en/documentation/getting-started/local_quickstart_go.md similarity index 96% rename from docs/en/build-with-mcp-toolbox/local_quickstart_go.md rename to docs/en/documentation/getting-started/local_quickstart_go.md index 843f0b5cdc8e..d2f7019b6c86 100644 --- a/docs/en/build-with-mcp-toolbox/local_quickstart_go.md +++ b/docs/en/documentation/getting-started/local_quickstart_go.md @@ -1,9 +1,11 @@ --- title: "Go Quickstart (Local)" type: docs -weight: 3 +weight: 4 description: > How to get started running MCP Toolbox locally with [Go](https://github.com/googleapis/mcp-toolbox-sdk-go), PostgreSQL, and orchestration frameworks such as [LangChain Go](https://tmc.github.io/langchaingo/docs/), [GenkitGo](https://genkit.dev/go/docs/get-started-go/), [Go GenAI](https://github.com/googleapis/go-genai) and [OpenAI Go](https://github.com/openai/openai-go). +sample_filters: ["Go", "Quickstart", "Local", "ADK", "LangChain", "OpenAI", "Genkit", "Google GenAI"] +is_sample: true --- ## Before you begin diff --git a/docs/en/build-with-mcp-toolbox/local_quickstart_js.md b/docs/en/documentation/getting-started/local_quickstart_js.md similarity index 95% rename from docs/en/build-with-mcp-toolbox/local_quickstart_js.md rename to docs/en/documentation/getting-started/local_quickstart_js.md index 0559dc16940e..0d45c2c363f1 100644 --- a/docs/en/build-with-mcp-toolbox/local_quickstart_js.md +++ b/docs/en/documentation/getting-started/local_quickstart_js.md @@ -1,9 +1,11 @@ --- title: "JS Quickstart (Local)" type: docs -weight: 2 +weight: 3 description: > How to get started running MCP Toolbox locally with [JavaScript](https://github.com/googleapis/mcp-toolbox-sdk-js), PostgreSQL, and orchestration frameworks such as [LangChain](https://js.langchain.com/docs/introduction/), [GenkitJS](https://genkit.dev/docs/get-started/), [LlamaIndex](https://ts.llamaindex.ai/) and [GoogleGenAI](https://github.com/googleapis/js-genai). +sample_filters: ["JavaScript", "Quickstart", "Local", "ADK", "LangChain", "LlamaIndex", "Genkit", "Google GenAI"] +is_sample: true --- ## Before you begin diff --git a/docs/en/build-with-mcp-toolbox/mcp_quickstart/_index.md b/docs/en/documentation/getting-started/mcp_quickstart/_index.md similarity index 97% rename from docs/en/build-with-mcp-toolbox/mcp_quickstart/_index.md rename to docs/en/documentation/getting-started/mcp_quickstart/_index.md index 83f1896f0a99..154512e687b3 100644 --- a/docs/en/build-with-mcp-toolbox/mcp_quickstart/_index.md +++ b/docs/en/documentation/getting-started/mcp_quickstart/_index.md @@ -1,16 +1,18 @@ --- title: "Quickstart (MCP)" type: docs -weight: 5 +weight: 1 description: > How to get started running Toolbox locally with MCP Inspector. +sample_filters: ["MCP Inspector", "Quickstart"] +is_sample: true --- ## Overview [Model Context Protocol](https://modelcontextprotocol.io) is an open protocol that standardizes how applications provide context to LLMs. Check out this page -on how to [connect to Toolbox via MCP](../../user-guide/connect-to/mcp-client/_index.md). +on how to [connect to Toolbox via MCP](../../connect-to/mcp-client/_index.md). ## Step 1: Set up your database @@ -211,7 +213,7 @@ In this section, we will download Toolbox, configure our tools in a ``` For more info on tools, check out the - [Tools](../../user-guide/configuration/tools/_index.md) section. + [Tools](../../configuration/tools/_index.md) section. 1. Run the Toolbox server, pointing to the `tools.yaml` file created earlier: diff --git a/docs/en/build-with-mcp-toolbox/bigquery/mcp_quickstart/inspector.png b/docs/en/documentation/getting-started/mcp_quickstart/inspector.png similarity index 100% rename from docs/en/build-with-mcp-toolbox/bigquery/mcp_quickstart/inspector.png rename to docs/en/documentation/getting-started/mcp_quickstart/inspector.png diff --git a/docs/en/build-with-mcp-toolbox/bigquery/mcp_quickstart/inspector_tools.png b/docs/en/documentation/getting-started/mcp_quickstart/inspector_tools.png similarity index 100% rename from docs/en/build-with-mcp-toolbox/bigquery/mcp_quickstart/inspector_tools.png rename to docs/en/documentation/getting-started/mcp_quickstart/inspector_tools.png diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/adkgo/go.mod b/docs/en/documentation/getting-started/quickstart/go/adkgo/go.mod similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/adkgo/go.mod rename to docs/en/documentation/getting-started/quickstart/go/adkgo/go.mod diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/adkgo/go.sum b/docs/en/documentation/getting-started/quickstart/go/adkgo/go.sum similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/adkgo/go.sum rename to docs/en/documentation/getting-started/quickstart/go/adkgo/go.sum diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/adkgo/quickstart.go b/docs/en/documentation/getting-started/quickstart/go/adkgo/quickstart.go similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/adkgo/quickstart.go rename to docs/en/documentation/getting-started/quickstart/go/adkgo/quickstart.go diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/genAI/go.mod b/docs/en/documentation/getting-started/quickstart/go/genAI/go.mod similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/genAI/go.mod rename to docs/en/documentation/getting-started/quickstart/go/genAI/go.mod diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/genAI/go.sum b/docs/en/documentation/getting-started/quickstart/go/genAI/go.sum similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/genAI/go.sum rename to docs/en/documentation/getting-started/quickstart/go/genAI/go.sum diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/genAI/quickstart.go b/docs/en/documentation/getting-started/quickstart/go/genAI/quickstart.go similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/genAI/quickstart.go rename to docs/en/documentation/getting-started/quickstart/go/genAI/quickstart.go diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/genkit/go.mod b/docs/en/documentation/getting-started/quickstart/go/genkit/go.mod similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/genkit/go.mod rename to docs/en/documentation/getting-started/quickstart/go/genkit/go.mod diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/genkit/go.sum b/docs/en/documentation/getting-started/quickstart/go/genkit/go.sum similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/genkit/go.sum rename to docs/en/documentation/getting-started/quickstart/go/genkit/go.sum diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/genkit/quickstart.go b/docs/en/documentation/getting-started/quickstart/go/genkit/quickstart.go similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/genkit/quickstart.go rename to docs/en/documentation/getting-started/quickstart/go/genkit/quickstart.go diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/langchain/go.mod b/docs/en/documentation/getting-started/quickstart/go/langchain/go.mod similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/langchain/go.mod rename to docs/en/documentation/getting-started/quickstart/go/langchain/go.mod diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/langchain/go.sum b/docs/en/documentation/getting-started/quickstart/go/langchain/go.sum similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/langchain/go.sum rename to docs/en/documentation/getting-started/quickstart/go/langchain/go.sum diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/langchain/quickstart.go b/docs/en/documentation/getting-started/quickstart/go/langchain/quickstart.go similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/langchain/quickstart.go rename to docs/en/documentation/getting-started/quickstart/go/langchain/quickstart.go diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/openAI/go.mod b/docs/en/documentation/getting-started/quickstart/go/openAI/go.mod similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/openAI/go.mod rename to docs/en/documentation/getting-started/quickstart/go/openAI/go.mod diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/openAI/go.sum b/docs/en/documentation/getting-started/quickstart/go/openAI/go.sum similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/openAI/go.sum rename to docs/en/documentation/getting-started/quickstart/go/openAI/go.sum diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/openAI/quickstart.go b/docs/en/documentation/getting-started/quickstart/go/openAI/quickstart.go similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/openAI/quickstart.go rename to docs/en/documentation/getting-started/quickstart/go/openAI/quickstart.go diff --git a/docs/en/build-with-mcp-toolbox/quickstart/go/quickstart_test.go b/docs/en/documentation/getting-started/quickstart/go/quickstart_test.go similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/go/quickstart_test.go rename to docs/en/documentation/getting-started/quickstart/go/quickstart_test.go diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/adk/package-lock.json b/docs/en/documentation/getting-started/quickstart/js/adk/package-lock.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/adk/package-lock.json rename to docs/en/documentation/getting-started/quickstart/js/adk/package-lock.json diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/adk/package.json b/docs/en/documentation/getting-started/quickstart/js/adk/package.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/adk/package.json rename to docs/en/documentation/getting-started/quickstart/js/adk/package.json diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/adk/quickstart.js b/docs/en/documentation/getting-started/quickstart/js/adk/quickstart.js similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/adk/quickstart.js rename to docs/en/documentation/getting-started/quickstart/js/adk/quickstart.js diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/genAI/package-lock.json b/docs/en/documentation/getting-started/quickstart/js/genAI/package-lock.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/genAI/package-lock.json rename to docs/en/documentation/getting-started/quickstart/js/genAI/package-lock.json diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/genAI/package.json b/docs/en/documentation/getting-started/quickstart/js/genAI/package.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/genAI/package.json rename to docs/en/documentation/getting-started/quickstart/js/genAI/package.json diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/genAI/quickstart.js b/docs/en/documentation/getting-started/quickstart/js/genAI/quickstart.js similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/genAI/quickstart.js rename to docs/en/documentation/getting-started/quickstart/js/genAI/quickstart.js diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/genkit/package-lock.json b/docs/en/documentation/getting-started/quickstart/js/genkit/package-lock.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/genkit/package-lock.json rename to docs/en/documentation/getting-started/quickstart/js/genkit/package-lock.json diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/genkit/package.json b/docs/en/documentation/getting-started/quickstart/js/genkit/package.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/genkit/package.json rename to docs/en/documentation/getting-started/quickstart/js/genkit/package.json diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/genkit/quickstart.js b/docs/en/documentation/getting-started/quickstart/js/genkit/quickstart.js similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/genkit/quickstart.js rename to docs/en/documentation/getting-started/quickstart/js/genkit/quickstart.js diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/langchain/package-lock.json b/docs/en/documentation/getting-started/quickstart/js/langchain/package-lock.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/langchain/package-lock.json rename to docs/en/documentation/getting-started/quickstart/js/langchain/package-lock.json diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/langchain/package.json b/docs/en/documentation/getting-started/quickstart/js/langchain/package.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/langchain/package.json rename to docs/en/documentation/getting-started/quickstart/js/langchain/package.json diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/langchain/quickstart.js b/docs/en/documentation/getting-started/quickstart/js/langchain/quickstart.js similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/langchain/quickstart.js rename to docs/en/documentation/getting-started/quickstart/js/langchain/quickstart.js diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/llamaindex/package-lock.json b/docs/en/documentation/getting-started/quickstart/js/llamaindex/package-lock.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/llamaindex/package-lock.json rename to docs/en/documentation/getting-started/quickstart/js/llamaindex/package-lock.json diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/llamaindex/package.json b/docs/en/documentation/getting-started/quickstart/js/llamaindex/package.json similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/llamaindex/package.json rename to docs/en/documentation/getting-started/quickstart/js/llamaindex/package.json diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/llamaindex/quickstart.js b/docs/en/documentation/getting-started/quickstart/js/llamaindex/quickstart.js similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/llamaindex/quickstart.js rename to docs/en/documentation/getting-started/quickstart/js/llamaindex/quickstart.js diff --git a/docs/en/build-with-mcp-toolbox/quickstart/js/quickstart.test.js b/docs/en/documentation/getting-started/quickstart/js/quickstart.test.js similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/js/quickstart.test.js rename to docs/en/documentation/getting-started/quickstart/js/quickstart.test.js diff --git a/docs/en/build-with-mcp-toolbox/quickstart/python/__init__.py b/docs/en/documentation/getting-started/quickstart/python/__init__.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/python/__init__.py rename to docs/en/documentation/getting-started/quickstart/python/__init__.py diff --git a/docs/en/build-with-mcp-toolbox/quickstart/python/adk/quickstart.py b/docs/en/documentation/getting-started/quickstart/python/adk/quickstart.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/python/adk/quickstart.py rename to docs/en/documentation/getting-started/quickstart/python/adk/quickstart.py diff --git a/docs/en/build-with-mcp-toolbox/quickstart/python/adk/requirements.txt b/docs/en/documentation/getting-started/quickstart/python/adk/requirements.txt similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/python/adk/requirements.txt rename to docs/en/documentation/getting-started/quickstart/python/adk/requirements.txt diff --git a/docs/en/build-with-mcp-toolbox/quickstart/python/core/quickstart.py b/docs/en/documentation/getting-started/quickstart/python/core/quickstart.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/python/core/quickstart.py rename to docs/en/documentation/getting-started/quickstart/python/core/quickstart.py diff --git a/docs/en/build-with-mcp-toolbox/quickstart/python/core/requirements.txt b/docs/en/documentation/getting-started/quickstart/python/core/requirements.txt similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/python/core/requirements.txt rename to docs/en/documentation/getting-started/quickstart/python/core/requirements.txt diff --git a/docs/en/build-with-mcp-toolbox/quickstart/python/langchain/quickstart.py b/docs/en/documentation/getting-started/quickstart/python/langchain/quickstart.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/python/langchain/quickstart.py rename to docs/en/documentation/getting-started/quickstart/python/langchain/quickstart.py diff --git a/docs/en/build-with-mcp-toolbox/quickstart/python/langchain/requirements.txt b/docs/en/documentation/getting-started/quickstart/python/langchain/requirements.txt similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/python/langchain/requirements.txt rename to docs/en/documentation/getting-started/quickstart/python/langchain/requirements.txt diff --git a/docs/en/build-with-mcp-toolbox/quickstart/python/llamaindex/quickstart.py b/docs/en/documentation/getting-started/quickstart/python/llamaindex/quickstart.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/python/llamaindex/quickstart.py rename to docs/en/documentation/getting-started/quickstart/python/llamaindex/quickstart.py diff --git a/docs/en/build-with-mcp-toolbox/quickstart/python/llamaindex/requirements.txt b/docs/en/documentation/getting-started/quickstart/python/llamaindex/requirements.txt similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/python/llamaindex/requirements.txt rename to docs/en/documentation/getting-started/quickstart/python/llamaindex/requirements.txt diff --git a/docs/en/build-with-mcp-toolbox/quickstart/python/quickstart_test.py b/docs/en/documentation/getting-started/quickstart/python/quickstart_test.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/python/quickstart_test.py rename to docs/en/documentation/getting-started/quickstart/python/quickstart_test.py diff --git a/docs/en/build-with-mcp-toolbox/quickstart/shared/cloud_setup.md b/docs/en/documentation/getting-started/quickstart/shared/cloud_setup.md similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/shared/cloud_setup.md rename to docs/en/documentation/getting-started/quickstart/shared/cloud_setup.md diff --git a/docs/en/build-with-mcp-toolbox/quickstart/shared/configure_toolbox.md b/docs/en/documentation/getting-started/quickstart/shared/configure_toolbox.md similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/shared/configure_toolbox.md rename to docs/en/documentation/getting-started/quickstart/shared/configure_toolbox.md diff --git a/docs/en/build-with-mcp-toolbox/quickstart/shared/database_setup.md b/docs/en/documentation/getting-started/quickstart/shared/database_setup.md similarity index 100% rename from docs/en/build-with-mcp-toolbox/quickstart/shared/database_setup.md rename to docs/en/documentation/getting-started/quickstart/shared/database_setup.md diff --git a/docs/en/user-guide/introduction/_index.md b/docs/en/documentation/introduction/_index.md similarity index 99% rename from docs/en/user-guide/introduction/_index.md rename to docs/en/documentation/introduction/_index.md index e6355581406b..0ed97078906d 100644 --- a/docs/en/user-guide/introduction/_index.md +++ b/docs/en/documentation/introduction/_index.md @@ -202,7 +202,7 @@ Toolbox enables dynamic reloading by default. To disable, use the To launch Toolbox's interactive UI, use the `--ui` flag. This allows you to test tools and toolsets with features such as authorized parameters. To learn more, -visit [Toolbox UI](../../user-guide/configuration/toolbox-ui/index.md). +visit [Toolbox UI](../configuration/toolbox-ui/index.md). ```sh ./toolbox --ui @@ -221,7 +221,7 @@ You can use `toolbox help` for a full list of flags! To stop the server, send a terminate signal (`ctrl+c` on most platforms). For more detailed documentation on deploying to different environments, check -out the resources in the [Deploy section](../../user-guide/deploy-to/_index.md) +out the resources in the [Deploy section](../../documentation/deploy-to/_index.md) ### Integrating your application diff --git a/docs/en/user-guide/introduction/architecture.png b/docs/en/documentation/introduction/architecture.png similarity index 100% rename from docs/en/user-guide/introduction/architecture.png rename to docs/en/documentation/introduction/architecture.png diff --git a/docs/en/user-guide/monitoring/_index.md b/docs/en/documentation/monitoring/_index.md similarity index 100% rename from docs/en/user-guide/monitoring/_index.md rename to docs/en/documentation/monitoring/_index.md diff --git a/docs/en/user-guide/monitoring/export_telemetry.md b/docs/en/documentation/monitoring/export_telemetry.md similarity index 100% rename from docs/en/user-guide/monitoring/export_telemetry.md rename to docs/en/documentation/monitoring/export_telemetry.md diff --git a/docs/en/user-guide/monitoring/telemetry/index.md b/docs/en/documentation/monitoring/telemetry/index.md similarity index 100% rename from docs/en/user-guide/monitoring/telemetry/index.md rename to docs/en/documentation/monitoring/telemetry/index.md diff --git a/docs/en/user-guide/monitoring/telemetry/telemetry_flow.png b/docs/en/documentation/monitoring/telemetry/telemetry_flow.png similarity index 100% rename from docs/en/user-guide/monitoring/telemetry/telemetry_flow.png rename to docs/en/documentation/monitoring/telemetry/telemetry_flow.png diff --git a/docs/en/user-guide/monitoring/telemetry/telemetry_traces.png b/docs/en/documentation/monitoring/telemetry/telemetry_traces.png similarity index 100% rename from docs/en/user-guide/monitoring/telemetry/telemetry_traces.png rename to docs/en/documentation/monitoring/telemetry/telemetry_traces.png diff --git a/docs/en/integrations/_index.md b/docs/en/integrations/_index.md index 5c07cc1cc43a..0f16ac1f7169 100644 --- a/docs/en/integrations/_index.md +++ b/docs/en/integrations/_index.md @@ -4,6 +4,7 @@ type: docs weight: 4 description: > Integrations connect the MCP Toolbox to your external data sources, unlocking specific sets of tools for your agents. +no_list: true --- An **Integration** represents a connection to a database or a HTTP Server. @@ -13,3 +14,5 @@ You can define the connection the **Source** just once in your `tools.yaml` file ## Exploring Integrations & Tools Select an integration below to view its configuration requirements. Depending on the integration, the documentation will provide the tools.yaml snippets needed to establish a source connection, detail any specific tools available to your agents, or both. + +{{< list-db >}} diff --git a/docs/en/integrations/alloydb-admin/_index.md b/docs/en/integrations/alloydb-admin/_index.md index da8dc88eaee8..10ccbd5d3313 100644 --- a/docs/en/integrations/alloydb-admin/_index.md +++ b/docs/en/integrations/alloydb-admin/_index.md @@ -1,48 +1,4 @@ --- -title: "AlloyDB Admin Source" -linkTitle: AlloyDB Admin -type: docs +title: "AlloyDB Admin" weight: 1 -description: "The \"alloydb-admin\" source provides a client for the AlloyDB API.\n" -no_list: true ---- - -## About - -The `alloydb-admin` source provides a client to interact with the [Google -AlloyDB API](https://cloud.google.com/alloydb/docs/reference/rest). This allows -tools to perform administrative tasks on AlloyDB resources, such as managing -clusters, instances, and users. - -Authentication can be handled in two ways: - -1. **Application Default Credentials (ADC):** By default, the source uses ADC - to authenticate with the API. -2. **Client-side OAuth:** If `useClientOAuth` is set to `true`, the source will - expect an OAuth 2.0 access token to be provided by the client (e.g., a web - browser) for each request. - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-alloydb-admin -type: alloydb-admin ---- -kind: sources -name: my-oauth-alloydb-admin -type: alloydb-admin -useClientOAuth: true -``` - -## Reference - -| **field** | **type** | **required** | **description** | -| -------------- | :------: | :----------: | ---------------------------------------------------------------------------------------------------------------------------------------------- | -| type | string | true | Must be "alloydb-admin". | -| defaultProject | string | false | The Google Cloud project ID to use for AlloyDB infrastructure tools. | -| useClientOAuth | boolean | false | If true, the source will use client-side OAuth for authorization. Otherwise, it will use Application Default Credentials. Defaults to `false`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/alloydb-admin/source.md b/docs/en/integrations/alloydb-admin/source.md new file mode 100644 index 000000000000..e580004590f7 --- /dev/null +++ b/docs/en/integrations/alloydb-admin/source.md @@ -0,0 +1,48 @@ +--- +title: "AlloyDB Admin" +linkTitle: "Source" +type: docs +weight: 1 +description: "The \"alloydb-admin\" source provides a client for the AlloyDB API.\n" +no_list: true +--- + +## About + +The `alloydb-admin` source provides a client to interact with the [Google +AlloyDB API](https://cloud.google.com/alloydb/docs/reference/rest). This allows +tools to perform administrative tasks on AlloyDB resources, such as managing +clusters, instances, and users. + +Authentication can be handled in two ways: + +1. **Application Default Credentials (ADC):** By default, the source uses ADC + to authenticate with the API. +2. **Client-side OAuth:** If `useClientOAuth` is set to `true`, the source will + expect an OAuth 2.0 access token to be provided by the client (e.g., a web + browser) for each request. + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-alloydb-admin +type: alloydb-admin +--- +kind: sources +name: my-oauth-alloydb-admin +type: alloydb-admin +useClientOAuth: true +``` + +## Reference + +| **field** | **type** | **required** | **description** | +| -------------- | :------: | :----------: | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| type | string | true | Must be "alloydb-admin". | +| defaultProject | string | false | The Google Cloud project ID to use for AlloyDB infrastructure tools. | +| useClientOAuth | boolean | false | If true, the source will use client-side OAuth for authorization. Otherwise, it will use Application Default Credentials. Defaults to `false`. | diff --git a/docs/en/integrations/alloydb-admin/tools/_index.md b/docs/en/integrations/alloydb-admin/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/alloydb-admin/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/alloydb-admin/alloydb-create-cluster.md b/docs/en/integrations/alloydb-admin/tools/alloydb-create-cluster.md similarity index 98% rename from docs/en/integrations/alloydb-admin/alloydb-create-cluster.md rename to docs/en/integrations/alloydb-admin/tools/alloydb-create-cluster.md index 7c0d7c285c25..44bb3acc43f7 100644 --- a/docs/en/integrations/alloydb-admin/alloydb-create-cluster.md +++ b/docs/en/integrations/alloydb-admin/tools/alloydb-create-cluster.md @@ -1,5 +1,5 @@ --- -title: alloydb-create-cluster Tool +title: alloydb-create-cluster type: docs weight: 1 description: "The \"alloydb-create-cluster\" tool creates a new AlloyDB for PostgreSQL cluster in a specified project and location.\n" diff --git a/docs/en/integrations/alloydb-admin/alloydb-create-instance.md b/docs/en/integrations/alloydb-admin/tools/alloydb-create-instance.md similarity index 98% rename from docs/en/integrations/alloydb-admin/alloydb-create-instance.md rename to docs/en/integrations/alloydb-admin/tools/alloydb-create-instance.md index 42bad695548c..e01411de4007 100644 --- a/docs/en/integrations/alloydb-admin/alloydb-create-instance.md +++ b/docs/en/integrations/alloydb-admin/tools/alloydb-create-instance.md @@ -1,5 +1,5 @@ --- -title: alloydb-create-instance Tool +title: alloydb-create-instance type: docs weight: 1 description: "The \"alloydb-create-instance\" tool creates a new AlloyDB instance within a specified cluster.\n" diff --git a/docs/en/integrations/alloydb-admin/alloydb-create-user.md b/docs/en/integrations/alloydb-admin/tools/alloydb-create-user.md similarity index 98% rename from docs/en/integrations/alloydb-admin/alloydb-create-user.md rename to docs/en/integrations/alloydb-admin/tools/alloydb-create-user.md index 9bcfdfe529d1..3ab42fb19203 100644 --- a/docs/en/integrations/alloydb-admin/alloydb-create-user.md +++ b/docs/en/integrations/alloydb-admin/tools/alloydb-create-user.md @@ -1,5 +1,5 @@ --- -title: alloydb-create-user Tool +title: alloydb-create-user type: docs weight: 2 description: "The \"alloydb-create-user\" tool creates a new database user within a specified AlloyDB cluster.\n" diff --git a/docs/en/integrations/alloydb-admin/alloydb-get-cluster.md b/docs/en/integrations/alloydb-admin/tools/alloydb-get-cluster.md similarity index 97% rename from docs/en/integrations/alloydb-admin/alloydb-get-cluster.md rename to docs/en/integrations/alloydb-admin/tools/alloydb-get-cluster.md index d330c8ade50f..dabd99a54ea9 100644 --- a/docs/en/integrations/alloydb-admin/alloydb-get-cluster.md +++ b/docs/en/integrations/alloydb-admin/tools/alloydb-get-cluster.md @@ -1,5 +1,5 @@ --- -title: alloydb-get-cluster Tool +title: alloydb-get-cluster type: docs weight: 1 description: "The \"alloydb-get-cluster\" tool retrieves details for a specific AlloyDB cluster.\n" diff --git a/docs/en/integrations/alloydb-admin/alloydb-get-instance.md b/docs/en/integrations/alloydb-admin/tools/alloydb-get-instance.md similarity index 97% rename from docs/en/integrations/alloydb-admin/alloydb-get-instance.md rename to docs/en/integrations/alloydb-admin/tools/alloydb-get-instance.md index 68c662c4c2cc..d101c58633b7 100644 --- a/docs/en/integrations/alloydb-admin/alloydb-get-instance.md +++ b/docs/en/integrations/alloydb-admin/tools/alloydb-get-instance.md @@ -1,5 +1,5 @@ --- -title: alloydb-get-instance Tool +title: alloydb-get-instance type: docs weight: 1 description: "The \"alloydb-get-instance\" tool retrieves details for a specific AlloyDB instance.\n" diff --git a/docs/en/integrations/alloydb-admin/alloydb-get-user.md b/docs/en/integrations/alloydb-admin/tools/alloydb-get-user.md similarity index 98% rename from docs/en/integrations/alloydb-admin/alloydb-get-user.md rename to docs/en/integrations/alloydb-admin/tools/alloydb-get-user.md index 38fbbaa4c810..8a971184ee81 100644 --- a/docs/en/integrations/alloydb-admin/alloydb-get-user.md +++ b/docs/en/integrations/alloydb-admin/tools/alloydb-get-user.md @@ -1,5 +1,5 @@ --- -title: alloydb-get-user Tool +title: alloydb-get-user type: docs weight: 1 description: "The \"alloydb-get-user\" tool retrieves details for a specific AlloyDB user.\n" diff --git a/docs/en/integrations/alloydb-admin/alloydb-list-clusters.md b/docs/en/integrations/alloydb-admin/tools/alloydb-list-clusters.md similarity index 98% rename from docs/en/integrations/alloydb-admin/alloydb-list-clusters.md rename to docs/en/integrations/alloydb-admin/tools/alloydb-list-clusters.md index 993f50ba99c3..3e445d0aa29b 100644 --- a/docs/en/integrations/alloydb-admin/alloydb-list-clusters.md +++ b/docs/en/integrations/alloydb-admin/tools/alloydb-list-clusters.md @@ -1,5 +1,5 @@ --- -title: alloydb-list-clusters Tool +title: alloydb-list-clusters type: docs weight: 1 description: "The \"alloydb-list-clusters\" tool lists the AlloyDB clusters in a given project and location.\n" diff --git a/docs/en/integrations/alloydb-admin/alloydb-list-instances.md b/docs/en/integrations/alloydb-admin/tools/alloydb-list-instances.md similarity index 98% rename from docs/en/integrations/alloydb-admin/alloydb-list-instances.md rename to docs/en/integrations/alloydb-admin/tools/alloydb-list-instances.md index 53afa3c77e78..fca2e23b445f 100644 --- a/docs/en/integrations/alloydb-admin/alloydb-list-instances.md +++ b/docs/en/integrations/alloydb-admin/tools/alloydb-list-instances.md @@ -1,5 +1,5 @@ --- -title: alloydb-list-instances Tool +title: alloydb-list-instances type: docs weight: 1 description: "The \"alloydb-list-instances\" tool lists the AlloyDB instances for a given project, cluster and location.\n" diff --git a/docs/en/integrations/alloydb-admin/alloydb-list-users.md b/docs/en/integrations/alloydb-admin/tools/alloydb-list-users.md similarity index 97% rename from docs/en/integrations/alloydb-admin/alloydb-list-users.md rename to docs/en/integrations/alloydb-admin/tools/alloydb-list-users.md index 348f08fe4cac..32daeb58bda1 100644 --- a/docs/en/integrations/alloydb-admin/alloydb-list-users.md +++ b/docs/en/integrations/alloydb-admin/tools/alloydb-list-users.md @@ -1,5 +1,5 @@ --- -title: alloydb-list-users Tool +title: alloydb-list-users type: docs weight: 1 description: "The \"alloydb-list-users\" tool lists all database users within an AlloyDB cluster.\n" diff --git a/docs/en/integrations/alloydb-admin/alloydb-wait-for-operation.md b/docs/en/integrations/alloydb-admin/tools/alloydb-wait-for-operation.md similarity index 98% rename from docs/en/integrations/alloydb-admin/alloydb-wait-for-operation.md rename to docs/en/integrations/alloydb-admin/tools/alloydb-wait-for-operation.md index 3c8ba95f9be4..d1bc5e4bc706 100644 --- a/docs/en/integrations/alloydb-admin/alloydb-wait-for-operation.md +++ b/docs/en/integrations/alloydb-admin/tools/alloydb-wait-for-operation.md @@ -1,5 +1,5 @@ --- -title: alloydb-wait-for-operation Tool +title: alloydb-wait-for-operation type: docs weight: 10 description: "Wait for a long-running AlloyDB operation to complete.\n" diff --git a/docs/en/integrations/alloydb/_index.md b/docs/en/integrations/alloydb/_index.md index 6b96998699bd..6f4e4439f0c5 100644 --- a/docs/en/integrations/alloydb/_index.md +++ b/docs/en/integrations/alloydb/_index.md @@ -1,145 +1,4 @@ --- -title: "AlloyDB for PostgreSQL Source" -linkTitle: "AlloyDB" -type: docs +title: "AlloyDB PostgreSQL" weight: 1 -description: > - AlloyDB for PostgreSQL is a fully-managed, PostgreSQL-compatible database for - demanding transactional workloads. -no_list: true ---- - -## About - -[AlloyDB for PostgreSQL][alloydb-docs] is a fully-managed, PostgreSQL-compatible -database for demanding transactional workloads. It provides enterprise-grade -performance and availability while maintaining 100% compatibility with -open-source PostgreSQL. - -If you are new to AlloyDB for PostgreSQL, you can [create a free trial -cluster][alloydb-free-trial]. - -[alloydb-docs]: https://cloud.google.com/alloydb/docs -[alloydb-free-trial]: https://cloud.google.com/alloydb/docs/create-free-trial-cluster - -## Available Tools - -{{< list-tools dirs="/integrations/postgres" >}} - -### Pre-built Configurations - -- [AlloyDB using MCP](../../user-guide/connect-to/ides/alloydb_pg_mcp.md) -Connect your IDE to AlloyDB using Toolbox. - -- [AlloyDB Admin API using MCP](../../user-guide/connect-to/ides/alloydb_pg_admin_mcp.md) -Create your AlloyDB database with MCP Toolbox. - -## Requirements - -### IAM Permissions - -By default, AlloyDB for PostgreSQL source uses the [AlloyDB Go -Connector][alloydb-go-conn] to authorize and establish mTLS connections to your -AlloyDB instance. The Go connector uses your [Application Default Credentials -(ADC)][adc] to authorize your connection to AlloyDB. - -In addition to [setting the ADC for your server][set-adc], you need to ensure -the IAM identity has been given the following IAM roles (or corresponding -permissions): - -- `roles/alloydb.client` -- `roles/serviceusage.serviceUsageConsumer` - -[alloydb-go-conn]: https://github.com/GoogleCloudPlatform/alloydb-go-connector -[adc]: https://cloud.google.com/docs/authentication#adc -[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc - -### Networking - -AlloyDB supports connecting over both from external networks via the internet -([public IP][public-ip]), and internal networks ([private IP][private-ip]). -For more information on choosing between the two options, see the AlloyDB page -[Connection overview][conn-overview]. - -You can configure the `ipType` parameter in your source configuration to -`public` or `private` to match your cluster's configuration. Regardless of which -you choose, all connections use IAM-based authorization and are encrypted with -mTLS. - -[private-ip]: https://cloud.google.com/alloydb/docs/private-ip -[public-ip]: https://cloud.google.com/alloydb/docs/connect-public-ip -[conn-overview]: https://cloud.google.com/alloydb/docs/connection-overview - -### Authentication - -This source supports both password-based authentication and IAM -authentication (using your [Application Default Credentials][adc]). - -#### Standard Authentication - -To connect using user/password, [create -a PostgreSQL user][alloydb-users] and input your credentials in the `user` and -`password` fields. - -```yaml -user: ${USER_NAME} -password: ${PASSWORD} -``` - -#### IAM Authentication - -To connect using IAM authentication: - -1. Prepare your database instance and user following this [guide][iam-guide]. -2. You could choose one of the two ways to log in: - - Specify your IAM email as the `user`. - - Leave your `user` field blank. Toolbox will fetch the [ADC][adc] - automatically and log in using the email associated with it. -3. Leave the `password` field blank. - -[iam-guide]: https://cloud.google.com/alloydb/docs/database-users/manage-iam-auth -[alloydb-users]: https://cloud.google.com/alloydb/docs/database-users/about - -## Example - -```yaml -kind: sources -name: my-alloydb-pg-source -type: alloydb-postgres -project: my-project-id -region: us-central1 -cluster: my-cluster -instance: my-instance -database: my_db -user: ${USER_NAME} -password: ${PASSWORD} -# ipType: "public" -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -### Managed Connection Pooling - -Toolbox automatically supports [Managed Connection Pooling][alloydb-mcp]. If your AlloyDB instance has Managed Connection Pooling enabled, the connection will immediately benefit from increased throughput and reduced latency. - -The interface is identical, so there's no additional configuration required on the client. For more information on configuring your instance, see the [AlloyDB Managed Connection Pooling documentation][alloydb-mcp-docs]. - -[alloydb-mcp]: https://cloud.google.com/blog/products/databases/alloydb-managed-connection-pooling -[alloydb-mcp-docs]: https://cloud.google.com/alloydb/docs/configure-managed-connection-pooling - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|--------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "alloydb-postgres". | -| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | -| region | string | true | Name of the GCP region that the cluster was created in (e.g. "us-central1"). | -| cluster | string | true | Name of the AlloyDB cluster (e.g. "my-cluster"). | -| instance | string | true | Name of the AlloyDB instance within the cluster (e.g. "my-instance"). | -| database | string | true | Name of the Postgres database to connect to (e.g. "my_db"). | -| user | string | false | Name of the Postgres user to connect as (e.g. "my-pg-user"). Defaults to IAM auth using [ADC][adc] email if unspecified. | -| password | string | false | Password of the Postgres user (e.g. "my-password"). Defaults to attempting IAM authentication if unspecified. | -| ipType | string | false | IP Type of the AlloyDB instance; must be one of `public` or `private`. Default: `public`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/alloydb/samples/_index.md b/docs/en/integrations/alloydb/samples/_index.md new file mode 100644 index 000000000000..e9548b273e4a --- /dev/null +++ b/docs/en/integrations/alloydb/samples/_index.md @@ -0,0 +1,4 @@ +--- +title: "Samples" +weight: 3 +--- diff --git a/docs/en/build-with-mcp-toolbox/alloydb/ai-nl/alloydb_ai_nl.ipynb b/docs/en/integrations/alloydb/samples/ai-nl/alloydb_ai_nl.ipynb similarity index 100% rename from docs/en/build-with-mcp-toolbox/alloydb/ai-nl/alloydb_ai_nl.ipynb rename to docs/en/integrations/alloydb/samples/ai-nl/alloydb_ai_nl.ipynb diff --git a/docs/en/build-with-mcp-toolbox/alloydb/ai-nl/index.md b/docs/en/integrations/alloydb/samples/ai-nl/index.md similarity index 77% rename from docs/en/build-with-mcp-toolbox/alloydb/ai-nl/index.md rename to docs/en/integrations/alloydb/samples/ai-nl/index.md index b6b7b0f41e64..b506b80fbf09 100644 --- a/docs/en/build-with-mcp-toolbox/alloydb/ai-nl/index.md +++ b/docs/en/integrations/alloydb/samples/ai-nl/index.md @@ -4,6 +4,8 @@ type: docs weight: 30 description: > An end to end tutorial for building an ADK agent using the AlloyDB AI NL tool. +sample_filters: ["AlloyDB", "ADK", "Python"] +is_sample: true --- {{< ipynb "alloydb_ai_nl.ipynb" >}} diff --git a/docs/en/build-with-mcp-toolbox/alloydb/mcp_quickstart.md b/docs/en/integrations/alloydb/samples/mcp_quickstart.md similarity index 95% rename from docs/en/build-with-mcp-toolbox/alloydb/mcp_quickstart.md rename to docs/en/integrations/alloydb/samples/mcp_quickstart.md index 8e09a458eed5..d5067a0e5bf1 100644 --- a/docs/en/build-with-mcp-toolbox/alloydb/mcp_quickstart.md +++ b/docs/en/integrations/alloydb/samples/mcp_quickstart.md @@ -4,13 +4,15 @@ type: docs weight: 7 description: > How to get started running Toolbox with MCP Inspector and AlloyDB as the source. +sample_filters: ["AlloyDB", "MCP Inspector"] +is_sample: true --- ## Overview [Model Context Protocol](https://modelcontextprotocol.io) is an open protocol that standardizes how applications provide context to LLMs. Check out this page -on how to [connect to Toolbox via MCP](../../user-guide/connect-to/mcp-client/_index.md). +on how to [connect to Toolbox via MCP](../../../documentation/connect-to/mcp-client/_index.md). ## Before you begin @@ -314,7 +316,7 @@ tools: ``` For more info on tools, check out the -[Tools](../../user-guide/configuration/tools/_index.md) section. +[Tools](../../../documentation/configuration/tools/_index.md) section. ## Step 4: Run the Toolbox server @@ -364,6 +366,6 @@ Run the Toolbox server, pointing to the `tools.yaml` file created earlier: ## What's next -- Learn more about [MCP Inspector](../../user-guide/connect-to/mcp-client/_index.md). -- Learn more about [Toolbox User Guide](../../user-guide/configuration/_index.md). -- Learn more about [Toolbox Tutorials](../../build-with-mcp-toolbox/_index.md). +- Learn more about [MCP Inspector](../../../documentation/connect-to/mcp-client/_index.md). +- Learn more about [Toolbox Configuration](../../../documentation/configuration/_index.md). +- Learn more about [Toolbox Tutorials](../../../samples-hub/_index.md). diff --git a/docs/en/integrations/alloydb/source.md b/docs/en/integrations/alloydb/source.md new file mode 100644 index 000000000000..d006a6732506 --- /dev/null +++ b/docs/en/integrations/alloydb/source.md @@ -0,0 +1,145 @@ +--- +title: "AlloyDB for PostgreSQL Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + AlloyDB for PostgreSQL is a fully-managed, PostgreSQL-compatible database for + demanding transactional workloads. +no_list: true +--- + +## About + +[AlloyDB for PostgreSQL][alloydb-docs] is a fully-managed, PostgreSQL-compatible +database for demanding transactional workloads. It provides enterprise-grade +performance and availability while maintaining 100% compatibility with +open-source PostgreSQL. + +If you are new to AlloyDB for PostgreSQL, you can [create a free trial +cluster][alloydb-free-trial]. + +[alloydb-docs]: https://cloud.google.com/alloydb/docs +[alloydb-free-trial]: https://cloud.google.com/alloydb/docs/create-free-trial-cluster + +## Available Tools + +{{< list-tools dirs="/integrations/postgres" >}} + +### Pre-built Configurations + +- [AlloyDB using MCP](../../documentation/connect-to/ides/alloydb_pg_mcp.md) +Connect your IDE to AlloyDB using Toolbox. + +- [AlloyDB Admin API using MCP](../../documentation/connect-to/ides/alloydb_pg_admin_mcp.md) +Create your AlloyDB database with MCP Toolbox. + +## Requirements + +### IAM Permissions + +By default, AlloyDB for PostgreSQL source uses the [AlloyDB Go +Connector][alloydb-go-conn] to authorize and establish mTLS connections to your +AlloyDB instance. The Go connector uses your [Application Default Credentials +(ADC)][adc] to authorize your connection to AlloyDB. + +In addition to [setting the ADC for your server][set-adc], you need to ensure +the IAM identity has been given the following IAM roles (or corresponding +permissions): + +- `roles/alloydb.client` +- `roles/serviceusage.serviceUsageConsumer` + +[alloydb-go-conn]: https://github.com/GoogleCloudPlatform/alloydb-go-connector +[adc]: https://cloud.google.com/docs/authentication#adc +[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc + +### Networking + +AlloyDB supports connecting over both from external networks via the internet +([public IP][public-ip]), and internal networks ([private IP][private-ip]). +For more information on choosing between the two options, see the AlloyDB page +[Connection overview][conn-overview]. + +You can configure the `ipType` parameter in your source configuration to +`public` or `private` to match your cluster's configuration. Regardless of which +you choose, all connections use IAM-based authorization and are encrypted with +mTLS. + +[private-ip]: https://cloud.google.com/alloydb/docs/private-ip +[public-ip]: https://cloud.google.com/alloydb/docs/connect-public-ip +[conn-overview]: https://cloud.google.com/alloydb/docs/connection-overview + +### Authentication + +This source supports both password-based authentication and IAM +authentication (using your [Application Default Credentials][adc]). + +#### Standard Authentication + +To connect using user/password, [create +a PostgreSQL user][alloydb-users] and input your credentials in the `user` and +`password` fields. + +```yaml +user: ${USER_NAME} +password: ${PASSWORD} +``` + +#### IAM Authentication + +To connect using IAM authentication: + +1. Prepare your database instance and user following this [guide][iam-guide]. +2. You could choose one of the two ways to log in: + - Specify your IAM email as the `user`. + - Leave your `user` field blank. Toolbox will fetch the [ADC][adc] + automatically and log in using the email associated with it. +3. Leave the `password` field blank. + +[iam-guide]: https://cloud.google.com/alloydb/docs/database-users/manage-iam-auth +[alloydb-users]: https://cloud.google.com/alloydb/docs/database-users/about + +## Example + +```yaml +kind: sources +name: my-alloydb-pg-source +type: alloydb-postgres +project: my-project-id +region: us-central1 +cluster: my-cluster +instance: my-instance +database: my_db +user: ${USER_NAME} +password: ${PASSWORD} +# ipType: "public" +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +### Managed Connection Pooling + +Toolbox automatically supports [Managed Connection Pooling][alloydb-mcp]. If your AlloyDB instance has Managed Connection Pooling enabled, the connection will immediately benefit from increased throughput and reduced latency. + +The interface is identical, so there's no additional configuration required on the client. For more information on configuring your instance, see the [AlloyDB Managed Connection Pooling documentation][alloydb-mcp-docs]. + +[alloydb-mcp]: https://cloud.google.com/blog/products/databases/alloydb-managed-connection-pooling +[alloydb-mcp-docs]: https://cloud.google.com/alloydb/docs/configure-managed-connection-pooling + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|--------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "alloydb-postgres". | +| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | +| region | string | true | Name of the GCP region that the cluster was created in (e.g. "us-central1"). | +| cluster | string | true | Name of the AlloyDB cluster (e.g. "my-cluster"). | +| instance | string | true | Name of the AlloyDB instance within the cluster (e.g. "my-instance"). | +| database | string | true | Name of the Postgres database to connect to (e.g. "my_db"). | +| user | string | false | Name of the Postgres user to connect as (e.g. "my-pg-user"). Defaults to IAM auth using [ADC][adc] email if unspecified. | +| password | string | false | Password of the Postgres user (e.g. "my-password"). Defaults to attempting IAM authentication if unspecified. | +| ipType | string | false | IP Type of the AlloyDB instance; must be one of `public` or `private`. Default: `public`. | diff --git a/docs/en/integrations/alloydb/tools/_index.md b/docs/en/integrations/alloydb/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/alloydb/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/alloydb/alloydb-ai-nl.md b/docs/en/integrations/alloydb/tools/alloydb-ai-nl.md similarity index 97% rename from docs/en/integrations/alloydb/alloydb-ai-nl.md rename to docs/en/integrations/alloydb/tools/alloydb-ai-nl.md index 4267f35d4118..f1817a49c112 100644 --- a/docs/en/integrations/alloydb/alloydb-ai-nl.md +++ b/docs/en/integrations/alloydb/tools/alloydb-ai-nl.md @@ -1,5 +1,5 @@ --- -title: "alloydb-ai-nl Tool" +title: "alloydb-ai-nl" type: docs weight: 1 description: > @@ -80,7 +80,7 @@ database queries. You can use the `nlConfigParameters` to list the parameters required for your `nl_config`. You **must** supply all parameters required for all PSVs in the -context. It's strongly recommended to use features like [Authenticated Parameters](../../user-guide/configuration/tools/_index.md#authenticated-parameters) or Bound Parameters to provide secure +context. It's strongly recommended to use features like [Authenticated Parameters](../../../documentation/configuration/tools/_index.md#authenticated-parameters) or Bound Parameters to provide secure access to queries generated using natural language, as these parameters are not visible to the LLM. diff --git a/docs/en/integrations/alloydb/tools/postgres-tools.md b/docs/en/integrations/alloydb/tools/postgres-tools.md new file mode 100644 index 000000000000..d5041aacf9ef --- /dev/null +++ b/docs/en/integrations/alloydb/tools/postgres-tools.md @@ -0,0 +1,8 @@ +--- +title: "PostgreSQL Tools" +weight: 90 +type: docs +is_wrapper: true +--- + +{{< list-tools dirs="integrations/postgres/tools" >}} \ No newline at end of file diff --git a/docs/en/integrations/bigquery/_index.md b/docs/en/integrations/bigquery/_index.md index d08d10bea5af..011c92776184 100644 --- a/docs/en/integrations/bigquery/_index.md +++ b/docs/en/integrations/bigquery/_index.md @@ -1,144 +1,4 @@ --- -title: "BigQuery Source" -type: docs +title: "BigQuery" weight: 1 -description: > - BigQuery is Google Cloud's fully managed, petabyte-scale, and cost-effective - analytics data warehouse that lets you run analytics over vast amounts of - data in near real time. With BigQuery, there's no infrastructure to set - up or manage, letting you focus on finding meaningful insights using - GoogleSQL and taking advantage of flexible pricing models across on-demand - and flat-rate options. -no_list: true --- - -## About - -[BigQuery][bigquery-docs] is Google Cloud's fully managed, petabyte-scale, -and cost-effective analytics data warehouse that lets you run analytics -over vast amounts of data in near real time. With BigQuery, there's no -infrastructure to set up or manage, letting you focus on finding meaningful -insights using GoogleSQL and taking advantage of flexible pricing models -across on-demand and flat-rate options. - -If you are new to BigQuery, you can try to -[load and query data with the bq tool][bigquery-quickstart-cli]. - -BigQuery uses [GoogleSQL][bigquery-googlesql] for querying data. GoogleSQL -is an ANSI-compliant structured query language (SQL) that is also implemented -for other Google Cloud services. SQL queries are handled by cluster nodes -in the same way as NoSQL data requests. Therefore, the same best practices -apply when creating SQL queries to run against your BigQuery data, such as -avoiding full table scans or complex filters. - -[bigquery-docs]: https://cloud.google.com/bigquery/docs -[bigquery-quickstart-cli]: - https://cloud.google.com/bigquery/docs/quickstarts/quickstart-command-line -[bigquery-googlesql]: - https://cloud.google.com/bigquery/docs/reference/standard-sql/ - -## Available Tools - -{{< list-tools >}} - -### Pre-built Configurations - -- [BigQuery using - MCP](https://googleapis.github.io/genai-toolbox/how-to/connect-ide/bigquery_mcp/) - Connect your IDE to BigQuery using Toolbox. - -## Requirements - -### IAM Permissions - -BigQuery uses [Identity and Access Management (IAM)][iam-overview] to control -user and group access to BigQuery resources like projects, datasets, and tables. - -### Authentication via Application Default Credentials (ADC) - -By **default**, Toolbox will use your [Application Default Credentials -(ADC)][adc] to authorize and authenticate when interacting with -[BigQuery][bigquery-docs]. - -When using this method, you need to ensure the IAM identity associated with your -ADC (such as a service account) has the correct permissions for the queries you -intend to run. Common roles include `roles/bigquery.user` (which includes -permissions to run jobs and read data) or `roles/bigbigquery.dataViewer`. -Follow this [guide][set-adc] to set up your ADC. - -If you are running on Google Compute Engine (GCE) or Google Kubernetes Engine -(GKE), you might need to explicitly set the access scopes for the service -account. While you can configure scopes when creating the VM or node pool, you -can also specify them in the source configuration using the `scopes` field. -Common scopes include `https://www.googleapis.com/auth/bigquery` or -`https://www.googleapis.com/auth/cloud-platform`. - -### Authentication via User's OAuth Access Token - -If the `useClientOAuth` parameter is set to `true`, Toolbox will instead use the -OAuth access token for authentication. This token is parsed from the -`Authorization` header passed in with the tool invocation request. This method -allows Toolbox to make queries to [BigQuery][bigquery-docs] on behalf of the -client or the end-user. - -When using this on-behalf-of authentication, you must ensure that the -identity used has been granted the correct IAM permissions. - -[iam-overview]: -[adc]: -[set-adc]: - -## Example - -Initialize a BigQuery source that uses ADC: - -```yaml -kind: sources -name: my-bigquery-source -type: "bigquery" -project: "my-project-id" -# location: "US" # Optional: Specifies the location for query jobs. -# writeMode: "allowed" # One of: allowed, blocked, protected. Defaults to "allowed". -# allowedDatasets: # Optional: Restricts tool access to a specific list of datasets. -# - "my_dataset_1" -# - "other_project.my_dataset_2" -# impersonateServiceAccount: "service-account@project-id.iam.gserviceaccount.com" # Optional: Service account to impersonate -# scopes: # Optional: List of OAuth scopes to request. -# - "https://www.googleapis.com/auth/bigquery" -# - "https://www.googleapis.com/auth/drive.readonly" -# maxQueryResultRows: 50 # Optional: Limits the number of rows returned by queries. Defaults to 50. -``` - -Initialize a BigQuery source that uses the client's access token: - -```yaml -kind: sources -name: my-bigquery-client-auth-source -type: "bigquery" -project: "my-project-id" -useClientOAuth: true -# location: "US" # Optional: Specifies the location for query jobs. -# writeMode: "allowed" # One of: allowed, blocked, protected. Defaults to "allowed". -# allowedDatasets: # Optional: Restricts tool access to a specific list of datasets. -# - "my_dataset_1" -# - "other_project.my_dataset_2" -# impersonateServiceAccount: "service-account@project-id.iam.gserviceaccount.com" # Optional: Service account to impersonate -# scopes: # Optional: List of OAuth scopes to request. -# - "https://www.googleapis.com/auth/bigquery" -# - "https://www.googleapis.com/auth/drive.readonly" -# maxQueryResultRows: 50 # Optional: Limits the number of rows returned by queries. Defaults to 50. -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|---------------------------|:--------:|:------------:|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "bigquery". | -| project | string | true | Id of the Google Cloud project to use for billing and as the default project for BigQuery resources. | -| location | string | false | Specifies the location (e.g., 'us', 'asia-northeast1') in which to run the query job. This location must match the location of any tables referenced in the query. Defaults to the table's location or 'US' if the location cannot be determined. [Learn More](https://cloud.google.com/bigquery/docs/locations) | -| writeMode | string | false | Controls the write behavior for tools. `allowed` (default): All queries are permitted. `blocked`: Only `SELECT` statements are allowed for the `bigquery-execute-sql` tool. `protected`: Enables session-based execution where all tools associated with this source instance share the same [BigQuery session](https://cloud.google.com/bigquery/docs/sessions-intro). This allows for stateful operations using temporary tables (e.g., `CREATE TEMP TABLE`). For `bigquery-execute-sql`, `SELECT` statements can be used on all tables, but write operations are restricted to the session's temporary dataset. For tools like `bigquery-sql`, `bigquery-forecast`, and `bigquery-analyze-contribution`, the `writeMode` restrictions do not apply, but they will operate within the shared session. **Note:** The `protected` mode cannot be used with `useClientOAuth: true`. It is also not recommended for multi-user server environments, as all users would share the same session. A session is terminated automatically after 24 hours of inactivity or after 7 days, whichever comes first. A new session is created on the next request, and any temporary data from the previous session will be lost. | -| allowedDatasets | []string | false | An optional list of dataset IDs that tools using this source are allowed to access. If provided, any tool operation attempting to access a dataset not in this list will be rejected. To enforce this, two types of operations are also disallowed: 1) Dataset-level operations (e.g., `CREATE SCHEMA`), and 2) operations where table access cannot be statically analyzed (e.g., `EXECUTE IMMEDIATE`, `CREATE PROCEDURE`). If a single dataset is provided, it will be treated as the default for prebuilt tools. | -| useClientOAuth | bool | false | If true, forwards the client's OAuth access token from the "Authorization" header to downstream queries. **Note:** This cannot be used with `writeMode: protected`. | -| scopes | []string | false | A list of OAuth 2.0 scopes to use for the credentials. If not provided, default scopes are used. | -| impersonateServiceAccount | string | false | Service account email to impersonate when making BigQuery and Dataplex API calls. The authenticated principal must have the `roles/iam.serviceAccountTokenCreator` role on the target service account. [Learn More](https://cloud.google.com/iam/docs/service-account-impersonation) | -| maxQueryResultRows | int | false | The maximum number of rows to return from a query. Defaults to 50. | diff --git a/docs/en/integrations/bigquery/samples/_index.md b/docs/en/integrations/bigquery/samples/_index.md new file mode 100644 index 000000000000..74220cd87bfb --- /dev/null +++ b/docs/en/integrations/bigquery/samples/_index.md @@ -0,0 +1,5 @@ +--- +title: "Samples" +weight: 3 +--- + diff --git a/docs/en/build-with-mcp-toolbox/bigquery/colab_quickstart_bigquery.ipynb b/docs/en/integrations/bigquery/samples/colab_quickstart_bigquery.ipynb similarity index 100% rename from docs/en/build-with-mcp-toolbox/bigquery/colab_quickstart_bigquery.ipynb rename to docs/en/integrations/bigquery/samples/colab_quickstart_bigquery.ipynb diff --git a/docs/en/build-with-mcp-toolbox/bigquery/local_quickstart.md b/docs/en/integrations/bigquery/samples/local_quickstart.md similarity index 99% rename from docs/en/build-with-mcp-toolbox/bigquery/local_quickstart.md rename to docs/en/integrations/bigquery/samples/local_quickstart.md index a45743875dc5..fc46e9898513 100644 --- a/docs/en/build-with-mcp-toolbox/bigquery/local_quickstart.md +++ b/docs/en/integrations/bigquery/samples/local_quickstart.md @@ -5,6 +5,8 @@ weight: 1 description: > How to get started running Toolbox locally with Python, BigQuery, and LangGraph, LlamaIndex, or ADK. +sample_filters: ["BigQuery", "Local", "ADK", "LangChain", "LlamaIndex", "Python"] +is_sample: true --- [![Open In @@ -294,7 +296,7 @@ to use BigQuery, and then run the Toolbox server. Alternatively, you can modify the agent code to load tools individually (e.g., using `await toolbox_client.load_tool("search-hotels-by-name")`). - For more info on tools, check out the [Configuring Tools](../../user-guide/configuration/tools/_index.md) section + For more info on tools, check out the [Configuring Tools](../../../documentation/configuration/tools/_index.md) section of the docs. 1. Run the Toolbox server, pointing to the `tools.yaml` file created earlier: diff --git a/docs/en/build-with-mcp-toolbox/bigquery/mcp_quickstart/_index.md b/docs/en/integrations/bigquery/samples/mcp_quickstart/_index.md similarity index 97% rename from docs/en/build-with-mcp-toolbox/bigquery/mcp_quickstart/_index.md rename to docs/en/integrations/bigquery/samples/mcp_quickstart/_index.md index 0baf40cda9fa..6c0c43df05cb 100644 --- a/docs/en/build-with-mcp-toolbox/bigquery/mcp_quickstart/_index.md +++ b/docs/en/integrations/bigquery/samples/mcp_quickstart/_index.md @@ -4,13 +4,15 @@ type: docs weight: 2 description: > How to get started running Toolbox with MCP Inspector and BigQuery as the source. +sample_filters: ["BigQuery", "MCP Inspector"] +is_sample: true --- ## Overview [Model Context Protocol](https://modelcontextprotocol.io) is an open protocol that standardizes how applications provide context to LLMs. Check out this page -on how to [connect to Toolbox via MCP](../../../user-guide/connect-to/mcp-client/_index.md). +on how to [connect to Toolbox via MCP](../../../../documentation/connect-to/mcp-client/_index.md). ## Step 1: Set up your BigQuery Dataset and Table @@ -201,7 +203,7 @@ In this section, we will download Toolbox, configure our tools in a ``` For more info on tools, check out the - [Tools](../../../user-guide/configuration/tools/_index.md) section. + [Tools](../../../../documentation/configuration/tools/_index.md) section. 1. Run the Toolbox server, pointing to the `tools.yaml` file created earlier: diff --git a/docs/en/build-with-mcp-toolbox/mcp_quickstart/inspector.png b/docs/en/integrations/bigquery/samples/mcp_quickstart/inspector.png similarity index 100% rename from docs/en/build-with-mcp-toolbox/mcp_quickstart/inspector.png rename to docs/en/integrations/bigquery/samples/mcp_quickstart/inspector.png diff --git a/docs/en/build-with-mcp-toolbox/looker/looker_mcp_inspector/inspector_tools.png b/docs/en/integrations/bigquery/samples/mcp_quickstart/inspector_tools.png similarity index 100% rename from docs/en/build-with-mcp-toolbox/looker/looker_mcp_inspector/inspector_tools.png rename to docs/en/integrations/bigquery/samples/mcp_quickstart/inspector_tools.png diff --git a/docs/en/integrations/bigquery/source.md b/docs/en/integrations/bigquery/source.md new file mode 100644 index 000000000000..e4c9e284b232 --- /dev/null +++ b/docs/en/integrations/bigquery/source.md @@ -0,0 +1,143 @@ +--- +title: "BigQuery" +weight: 1 +description: > + BigQuery is Google Cloud's fully managed, petabyte-scale, and cost-effective + analytics data warehouse that lets you run analytics over vast amounts of + data in near real time. With BigQuery, there's no infrastructure to set + up or manage, letting you focus on finding meaningful insights using + GoogleSQL and taking advantage of flexible pricing models across on-demand + and flat-rate options. +no_list: true +--- + +## About + +[BigQuery][bigquery-docs] is Google Cloud's fully managed, petabyte-scale, +and cost-effective analytics data warehouse that lets you run analytics +over vast amounts of data in near real time. With BigQuery, there's no +infrastructure to set up or manage, letting you focus on finding meaningful +insights using GoogleSQL and taking advantage of flexible pricing models +across on-demand and flat-rate options. + +If you are new to BigQuery, you can try to +[load and query data with the bq tool][bigquery-quickstart-cli]. + +BigQuery uses [GoogleSQL][bigquery-googlesql] for querying data. GoogleSQL +is an ANSI-compliant structured query language (SQL) that is also implemented +for other Google Cloud services. SQL queries are handled by cluster nodes +in the same way as NoSQL data requests. Therefore, the same best practices +apply when creating SQL queries to run against your BigQuery data, such as +avoiding full table scans or complex filters. + +[bigquery-docs]: https://cloud.google.com/bigquery/docs +[bigquery-quickstart-cli]: + https://cloud.google.com/bigquery/docs/quickstarts/quickstart-command-line +[bigquery-googlesql]: + https://cloud.google.com/bigquery/docs/reference/standard-sql/ + +## Available Tools + +{{< list-tools >}} + +### Pre-built Configurations + +- [BigQuery using + MCP](https://googleapis.github.io/genai-toolbox/how-to/connect-ide/bigquery_mcp/) + Connect your IDE to BigQuery using Toolbox. + +## Requirements + +### IAM Permissions + +BigQuery uses [Identity and Access Management (IAM)][iam-overview] to control +user and group access to BigQuery resources like projects, datasets, and tables. + +### Authentication via Application Default Credentials (ADC) + +By **default**, Toolbox will use your [Application Default Credentials +(ADC)][adc] to authorize and authenticate when interacting with +[BigQuery][bigquery-docs]. + +When using this method, you need to ensure the IAM identity associated with your +ADC (such as a service account) has the correct permissions for the queries you +intend to run. Common roles include `roles/bigquery.user` (which includes +permissions to run jobs and read data) or `roles/bigbigquery.dataViewer`. +Follow this [guide][set-adc] to set up your ADC. + +If you are running on Google Compute Engine (GCE) or Google Kubernetes Engine +(GKE), you might need to explicitly set the access scopes for the service +account. While you can configure scopes when creating the VM or node pool, you +can also specify them in the source configuration using the `scopes` field. +Common scopes include `https://www.googleapis.com/auth/bigquery` or +`https://www.googleapis.com/auth/cloud-platform`. + +### Authentication via User's OAuth Access Token + +If the `useClientOAuth` parameter is set to `true`, Toolbox will instead use the +OAuth access token for authentication. This token is parsed from the +`Authorization` header passed in with the tool invocation request. This method +allows Toolbox to make queries to [BigQuery][bigquery-docs] on behalf of the +client or the end-user. + +When using this on-behalf-of authentication, you must ensure that the +identity used has been granted the correct IAM permissions. + +[iam-overview]: +[adc]: +[set-adc]: + +## Example + +Initialize a BigQuery source that uses ADC: + +```yaml +kind: sources +name: my-bigquery-source +type: "bigquery" +project: "my-project-id" +# location: "US" # Optional: Specifies the location for query jobs. +# writeMode: "allowed" # One of: allowed, blocked, protected. Defaults to "allowed". +# allowedDatasets: # Optional: Restricts tool access to a specific list of datasets. +# - "my_dataset_1" +# - "other_project.my_dataset_2" +# impersonateServiceAccount: "service-account@project-id.iam.gserviceaccount.com" # Optional: Service account to impersonate +# scopes: # Optional: List of OAuth scopes to request. +# - "https://www.googleapis.com/auth/bigquery" +# - "https://www.googleapis.com/auth/drive.readonly" +# maxQueryResultRows: 50 # Optional: Limits the number of rows returned by queries. Defaults to 50. +``` + +Initialize a BigQuery source that uses the client's access token: + +```yaml +kind: sources +name: my-bigquery-client-auth-source +type: "bigquery" +project: "my-project-id" +useClientOAuth: true +# location: "US" # Optional: Specifies the location for query jobs. +# writeMode: "allowed" # One of: allowed, blocked, protected. Defaults to "allowed". +# allowedDatasets: # Optional: Restricts tool access to a specific list of datasets. +# - "my_dataset_1" +# - "other_project.my_dataset_2" +# impersonateServiceAccount: "service-account@project-id.iam.gserviceaccount.com" # Optional: Service account to impersonate +# scopes: # Optional: List of OAuth scopes to request. +# - "https://www.googleapis.com/auth/bigquery" +# - "https://www.googleapis.com/auth/drive.readonly" +# maxQueryResultRows: 50 # Optional: Limits the number of rows returned by queries. Defaults to 50. +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|---------------------------|:--------:|:------------:|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "bigquery". | +| project | string | true | Id of the Google Cloud project to use for billing and as the default project for BigQuery resources. | +| location | string | false | Specifies the location (e.g., 'us', 'asia-northeast1') in which to run the query job. This location must match the location of any tables referenced in the query. Defaults to the table's location or 'US' if the location cannot be determined. [Learn More](https://cloud.google.com/bigquery/docs/locations) | +| writeMode | string | false | Controls the write behavior for tools. `allowed` (default): All queries are permitted. `blocked`: Only `SELECT` statements are allowed for the `bigquery-execute-sql` tool. `protected`: Enables session-based execution where all tools associated with this source instance share the same [BigQuery session](https://cloud.google.com/bigquery/docs/sessions-intro). This allows for stateful operations using temporary tables (e.g., `CREATE TEMP TABLE`). For `bigquery-execute-sql`, `SELECT` statements can be used on all tables, but write operations are restricted to the session's temporary dataset. For tools like `bigquery-sql`, `bigquery-forecast`, and `bigquery-analyze-contribution`, the `writeMode` restrictions do not apply, but they will operate within the shared session. **Note:** The `protected` mode cannot be used with `useClientOAuth: true`. It is also not recommended for multi-user server environments, as all users would share the same session. A session is terminated automatically after 24 hours of inactivity or after 7 days, whichever comes first. A new session is created on the next request, and any temporary data from the previous session will be lost. | +| allowedDatasets | []string | false | An optional list of dataset IDs that tools using this source are allowed to access. If provided, any tool operation attempting to access a dataset not in this list will be rejected. To enforce this, two types of operations are also disallowed: 1) Dataset-level operations (e.g., `CREATE SCHEMA`), and 2) operations where table access cannot be statically analyzed (e.g., `EXECUTE IMMEDIATE`, `CREATE PROCEDURE`). If a single dataset is provided, it will be treated as the default for prebuilt tools. | +| useClientOAuth | bool | false | If true, forwards the client's OAuth access token from the "Authorization" header to downstream queries. **Note:** This cannot be used with `writeMode: protected`. | +| scopes | []string | false | A list of OAuth 2.0 scopes to use for the credentials. If not provided, default scopes are used. | +| impersonateServiceAccount | string | false | Service account email to impersonate when making BigQuery and Dataplex API calls. The authenticated principal must have the `roles/iam.serviceAccountTokenCreator` role on the target service account. [Learn More](https://cloud.google.com/iam/docs/service-account-impersonation) | +| maxQueryResultRows | int | false | The maximum number of rows to return from a query. Defaults to 50. | diff --git a/docs/en/integrations/bigquery/tools/_index.md b/docs/en/integrations/bigquery/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/bigquery/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/bigquery/bigquery-analyze-contribution.md b/docs/en/integrations/bigquery/tools/bigquery-analyze-contribution.md similarity index 98% rename from docs/en/integrations/bigquery/bigquery-analyze-contribution.md rename to docs/en/integrations/bigquery/tools/bigquery-analyze-contribution.md index dcdd2b2f3eaa..5a34f193eb58 100644 --- a/docs/en/integrations/bigquery/bigquery-analyze-contribution.md +++ b/docs/en/integrations/bigquery/tools/bigquery-analyze-contribution.md @@ -1,5 +1,5 @@ --- -title: "bigquery-analyze-contribution Tool" +title: "bigquery-analyze-contribution" type: docs weight: 1 description: > diff --git a/docs/en/integrations/bigquery/bigquery-conversational-analytics.md b/docs/en/integrations/bigquery/tools/bigquery-conversational-analytics.md similarity index 98% rename from docs/en/integrations/bigquery/bigquery-conversational-analytics.md rename to docs/en/integrations/bigquery/tools/bigquery-conversational-analytics.md index 6d1f7794e23f..8852751a3294 100644 --- a/docs/en/integrations/bigquery/bigquery-conversational-analytics.md +++ b/docs/en/integrations/bigquery/tools/bigquery-conversational-analytics.md @@ -1,5 +1,5 @@ --- -title: "bigquery-conversational-analytics Tool" +title: "bigquery-conversational-analytics" type: docs weight: 1 description: > diff --git a/docs/en/integrations/bigquery/bigquery-execute-sql.md b/docs/en/integrations/bigquery/tools/bigquery-execute-sql.md similarity index 98% rename from docs/en/integrations/bigquery/bigquery-execute-sql.md rename to docs/en/integrations/bigquery/tools/bigquery-execute-sql.md index 182b500c05ac..b03e3bde033b 100644 --- a/docs/en/integrations/bigquery/bigquery-execute-sql.md +++ b/docs/en/integrations/bigquery/tools/bigquery-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "bigquery-execute-sql Tool" +title: "bigquery-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/bigquery/bigquery-forecast.md b/docs/en/integrations/bigquery/tools/bigquery-forecast.md similarity index 99% rename from docs/en/integrations/bigquery/bigquery-forecast.md rename to docs/en/integrations/bigquery/tools/bigquery-forecast.md index 5d215d8f0d22..365af065c114 100644 --- a/docs/en/integrations/bigquery/bigquery-forecast.md +++ b/docs/en/integrations/bigquery/tools/bigquery-forecast.md @@ -1,5 +1,5 @@ --- -title: "bigquery-forecast Tool" +title: "bigquery-forecast" type: docs weight: 1 description: > diff --git a/docs/en/integrations/bigquery/bigquery-get-dataset-info.md b/docs/en/integrations/bigquery/tools/bigquery-get-dataset-info.md similarity index 98% rename from docs/en/integrations/bigquery/bigquery-get-dataset-info.md rename to docs/en/integrations/bigquery/tools/bigquery-get-dataset-info.md index c58b3eab32ba..5d70165d863a 100644 --- a/docs/en/integrations/bigquery/bigquery-get-dataset-info.md +++ b/docs/en/integrations/bigquery/tools/bigquery-get-dataset-info.md @@ -1,5 +1,5 @@ --- -title: "bigquery-get-dataset-info Tool" +title: "bigquery-get-dataset-info" type: docs weight: 1 description: > diff --git a/docs/en/integrations/bigquery/bigquery-get-table-info.md b/docs/en/integrations/bigquery/tools/bigquery-get-table-info.md similarity index 98% rename from docs/en/integrations/bigquery/bigquery-get-table-info.md rename to docs/en/integrations/bigquery/tools/bigquery-get-table-info.md index f06358b5de77..e2ec23a0d55b 100644 --- a/docs/en/integrations/bigquery/bigquery-get-table-info.md +++ b/docs/en/integrations/bigquery/tools/bigquery-get-table-info.md @@ -1,5 +1,5 @@ --- -title: "bigquery-get-table-info Tool" +title: "bigquery-get-table-info" type: docs weight: 1 description: > diff --git a/docs/en/integrations/bigquery/bigquery-list-dataset-ids.md b/docs/en/integrations/bigquery/tools/bigquery-list-dataset-ids.md similarity index 98% rename from docs/en/integrations/bigquery/bigquery-list-dataset-ids.md rename to docs/en/integrations/bigquery/tools/bigquery-list-dataset-ids.md index c0708730288e..23e8f6208306 100644 --- a/docs/en/integrations/bigquery/bigquery-list-dataset-ids.md +++ b/docs/en/integrations/bigquery/tools/bigquery-list-dataset-ids.md @@ -1,5 +1,5 @@ --- -title: "bigquery-list-dataset-ids Tool" +title: "bigquery-list-dataset-ids" type: docs weight: 1 description: > diff --git a/docs/en/integrations/bigquery/bigquery-list-table-ids.md b/docs/en/integrations/bigquery/tools/bigquery-list-table-ids.md similarity index 98% rename from docs/en/integrations/bigquery/bigquery-list-table-ids.md rename to docs/en/integrations/bigquery/tools/bigquery-list-table-ids.md index dedff165ee61..401780cc0f2f 100644 --- a/docs/en/integrations/bigquery/bigquery-list-table-ids.md +++ b/docs/en/integrations/bigquery/tools/bigquery-list-table-ids.md @@ -1,5 +1,5 @@ --- -title: "bigquery-list-table-ids Tool" +title: "bigquery-list-table-ids" type: docs weight: 1 description: > diff --git a/docs/en/integrations/bigquery/bigquery-search-catalog.md b/docs/en/integrations/bigquery/tools/bigquery-search-catalog.md similarity index 98% rename from docs/en/integrations/bigquery/bigquery-search-catalog.md rename to docs/en/integrations/bigquery/tools/bigquery-search-catalog.md index 39c725b02536..cf4b8efcfbfc 100644 --- a/docs/en/integrations/bigquery/bigquery-search-catalog.md +++ b/docs/en/integrations/bigquery/tools/bigquery-search-catalog.md @@ -1,5 +1,5 @@ --- -title: "bigquery-search-catalog Tool" +title: "bigquery-search-catalog" type: docs weight: 1 description: > diff --git a/docs/en/integrations/bigquery/bigquery-sql.md b/docs/en/integrations/bigquery/tools/bigquery-sql.md similarity index 99% rename from docs/en/integrations/bigquery/bigquery-sql.md rename to docs/en/integrations/bigquery/tools/bigquery-sql.md index 0d77d5e6f720..dbfaa874420d 100644 --- a/docs/en/integrations/bigquery/bigquery-sql.md +++ b/docs/en/integrations/bigquery/tools/bigquery-sql.md @@ -1,5 +1,5 @@ --- -title: "bigquery-sql Tool" +title: "bigquery-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/bigtable/_index.md b/docs/en/integrations/bigtable/_index.md index 5cd5ce4988f7..f33a6480b066 100644 --- a/docs/en/integrations/bigtable/_index.md +++ b/docs/en/integrations/bigtable/_index.md @@ -1,74 +1,4 @@ --- -title: "Bigtable Source" -type: docs +title: "Bigtable" weight: 1 -description: > - Bigtable is a low-latency NoSQL database service for machine learning, operational analytics, and user-facing operations. It's a wide-column, key-value store that can scale to billions of rows and thousands of columns. With Bigtable, you can replicate your data to regions across the world for high availability and data resiliency. -no_list: true ---- - -## About - -[Bigtable][bigtable-docs] is a low-latency NoSQL database service for machine -learning, operational analytics, and user-facing operations. It's a wide-column, -key-value store that can scale to billions of rows and thousands of columns. -With Bigtable, you can replicate your data to regions across the world for high -availability and data resiliency. - -If you are new to Bigtable, you can try to [create an instance and write data -with the cbt CLI][bigtable-quickstart-with-cli]. - -You can use [GoogleSQL statements][bigtable-googlesql] to query your Bigtable -data. GoogleSQL is an ANSI-compliant structured query language (SQL) that is -also implemented for other Google Cloud services. SQL queries are handled by -cluster nodes in the same way as NoSQL data requests. Therefore, the same best -practices apply when creating SQL queries to run against your Bigtable data, -such as avoiding full table scans or complex filters. - -[bigtable-docs]: https://cloud.google.com/bigtable/docs -[bigtable-quickstart-with-cli]: - https://cloud.google.com/bigtable/docs/create-instance-write-data-cbt-cli - -[bigtable-googlesql]: - https://cloud.google.com/bigtable/docs/googlesql-overview - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### IAM Permissions - -Bigtable uses [Identity and Access Management (IAM)][iam-overview] to control -user and group access to Bigtable resources at the project, instance, table, and -backup level. Toolbox will use your [Application Default Credentials (ADC)][adc] -to authorize and authenticate when interacting with [Bigtable][bigtable-docs]. - -In addition to [setting the ADC for your server][set-adc], you need to ensure -the IAM identity has been given the correct IAM permissions for the query -provided. See [Apply IAM roles][grant-permissions] for more information on -applying IAM permissions and roles to an identity. - -[iam-overview]: https://cloud.google.com/bigtable/docs/access-control -[adc]: https://cloud.google.com/docs/authentication#adc -[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc -[grant-permissions]: https://cloud.google.com/bigtable/docs/access-control#iam-management-instance - -## Example - -```yaml -kind: sources -name: my-bigtable-source -type: "bigtable" -project: "my-project-id" -instance: "test-instance" -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|-------------------------------------------------------------------------------| -| type | string | true | Must be "bigtable". | -| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | -| instance | string | true | Name of the Bigtable instance. | +--- \ No newline at end of file diff --git a/docs/en/integrations/bigtable/source.md b/docs/en/integrations/bigtable/source.md new file mode 100644 index 000000000000..efe289e25863 --- /dev/null +++ b/docs/en/integrations/bigtable/source.md @@ -0,0 +1,75 @@ +--- +title: "Bigtable Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Bigtable is a low-latency NoSQL database service for machine learning, operational analytics, and user-facing operations. It's a wide-column, key-value store that can scale to billions of rows and thousands of columns. With Bigtable, you can replicate your data to regions across the world for high availability and data resiliency. +no_list: true +--- + +## About + +[Bigtable][bigtable-docs] is a low-latency NoSQL database service for machine +learning, operational analytics, and user-facing operations. It's a wide-column, +key-value store that can scale to billions of rows and thousands of columns. +With Bigtable, you can replicate your data to regions across the world for high +availability and data resiliency. + +If you are new to Bigtable, you can try to [create an instance and write data +with the cbt CLI][bigtable-quickstart-with-cli]. + +You can use [GoogleSQL statements][bigtable-googlesql] to query your Bigtable +data. GoogleSQL is an ANSI-compliant structured query language (SQL) that is +also implemented for other Google Cloud services. SQL queries are handled by +cluster nodes in the same way as NoSQL data requests. Therefore, the same best +practices apply when creating SQL queries to run against your Bigtable data, +such as avoiding full table scans or complex filters. + +[bigtable-docs]: https://cloud.google.com/bigtable/docs +[bigtable-quickstart-with-cli]: + https://cloud.google.com/bigtable/docs/create-instance-write-data-cbt-cli + +[bigtable-googlesql]: + https://cloud.google.com/bigtable/docs/googlesql-overview + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### IAM Permissions + +Bigtable uses [Identity and Access Management (IAM)][iam-overview] to control +user and group access to Bigtable resources at the project, instance, table, and +backup level. Toolbox will use your [Application Default Credentials (ADC)][adc] +to authorize and authenticate when interacting with [Bigtable][bigtable-docs]. + +In addition to [setting the ADC for your server][set-adc], you need to ensure +the IAM identity has been given the correct IAM permissions for the query +provided. See [Apply IAM roles][grant-permissions] for more information on +applying IAM permissions and roles to an identity. + +[iam-overview]: https://cloud.google.com/bigtable/docs/access-control +[adc]: https://cloud.google.com/docs/authentication#adc +[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc +[grant-permissions]: https://cloud.google.com/bigtable/docs/access-control#iam-management-instance + +## Example + +```yaml +kind: sources +name: my-bigtable-source +type: "bigtable" +project: "my-project-id" +instance: "test-instance" +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|-------------------------------------------------------------------------------| +| type | string | true | Must be "bigtable". | +| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | +| instance | string | true | Name of the Bigtable instance. | diff --git a/docs/en/integrations/bigtable/tools/_index.md b/docs/en/integrations/bigtable/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/bigtable/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/bigtable/bigtable-sql.md b/docs/en/integrations/bigtable/tools/bigtable-sql.md similarity index 99% rename from docs/en/integrations/bigtable/bigtable-sql.md rename to docs/en/integrations/bigtable/tools/bigtable-sql.md index 31811b20fd60..df926ae1c0c9 100644 --- a/docs/en/integrations/bigtable/bigtable-sql.md +++ b/docs/en/integrations/bigtable/tools/bigtable-sql.md @@ -1,5 +1,5 @@ --- -title: "bigtable-sql Tool" +title: "bigtable-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cassandra/_index.md b/docs/en/integrations/cassandra/_index.md index d9a14609d85f..15e60bd17ad0 100644 --- a/docs/en/integrations/cassandra/_index.md +++ b/docs/en/integrations/cassandra/_index.md @@ -1,59 +1,4 @@ --- -title: "Cassandra Source" -type: docs +title: "Cassandra" weight: 1 -description: > - Apache Cassandra is a NoSQL distributed database known for its horizontal scalability, distributed architecture, and flexible schema definition. -no_list: true ---- - -## About - -[Apache Cassandra][cassandra-docs] is a NoSQL distributed database. By design, -NoSQL databases are lightweight, open-source, non-relational, and largely -distributed. Counted among their strengths are horizontal scalability, -distributed architectures, and a flexible approach to schema definition. - -[cassandra-docs]: https://cassandra.apache.org/ - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-cassandra-source -type: cassandra -hosts: - - 127.0.0.1 -keyspace: my_keyspace -protoVersion: 4 -username: ${USER_NAME} -password: ${PASSWORD} -caPath: /path/to/ca.crt # Optional: path to CA certificate -certPath: /path/to/client.crt # Optional: path to client certificate -keyPath: /path/to/client.key # Optional: path to client key -enableHostVerification: true # Optional: enable host verification -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|------------------------|:--------:|:------------:|----------------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "cassandra". | -| hosts | string[] | true | List of IP addresses to connect to (e.g., ["192.168.1.1:9042", "192.168.1.2:9042","192.168.1.3:9042"]). The default port is 9042 if not specified. | -| keyspace | string | true | Name of the Cassandra keyspace to connect to (e.g., "my_keyspace"). | -| protoVersion | integer | false | Protocol version for the Cassandra connection (e.g., 4). | -| username | string | false | Name of the Cassandra user to connect as (e.g., "my-cassandra-user"). | -| password | string | false | Password of the Cassandra user (e.g., "my-password"). | -| caPath | string | false | Path to the CA certificate for SSL/TLS (e.g., "/path/to/ca.crt"). | -| certPath | string | false | Path to the client certificate for SSL/TLS (e.g., "/path/to/client.crt"). | -| keyPath | string | false | Path to the client key for SSL/TLS (e.g., "/path/to/client.key"). | -| enableHostVerification | boolean | false | Enable host verification for SSL/TLS (e.g., true). By default, host verification is disabled. | +--- \ No newline at end of file diff --git a/docs/en/integrations/cassandra/source.md b/docs/en/integrations/cassandra/source.md new file mode 100644 index 000000000000..87e524d21ba1 --- /dev/null +++ b/docs/en/integrations/cassandra/source.md @@ -0,0 +1,60 @@ +--- +title: "Cassandra Source" +type: docs +linkTitle: "Source" +weight: 1 +description: > + Apache Cassandra is a NoSQL distributed database known for its horizontal scalability, distributed architecture, and flexible schema definition. +no_list: true +--- + +## About + +[Apache Cassandra][cassandra-docs] is a NoSQL distributed database. By design, +NoSQL databases are lightweight, open-source, non-relational, and largely +distributed. Counted among their strengths are horizontal scalability, +distributed architectures, and a flexible approach to schema definition. + +[cassandra-docs]: https://cassandra.apache.org/ + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-cassandra-source +type: cassandra +hosts: + - 127.0.0.1 +keyspace: my_keyspace +protoVersion: 4 +username: ${USER_NAME} +password: ${PASSWORD} +caPath: /path/to/ca.crt # Optional: path to CA certificate +certPath: /path/to/client.crt # Optional: path to client certificate +keyPath: /path/to/client.key # Optional: path to client key +enableHostVerification: true # Optional: enable host verification +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|------------------------|:--------:|:------------:|----------------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "cassandra". | +| hosts | string[] | true | List of IP addresses to connect to (e.g., ["192.168.1.1:9042", "192.168.1.2:9042","192.168.1.3:9042"]). The default port is 9042 if not specified. | +| keyspace | string | true | Name of the Cassandra keyspace to connect to (e.g., "my_keyspace"). | +| protoVersion | integer | false | Protocol version for the Cassandra connection (e.g., 4). | +| username | string | false | Name of the Cassandra user to connect as (e.g., "my-cassandra-user"). | +| password | string | false | Password of the Cassandra user (e.g., "my-password"). | +| caPath | string | false | Path to the CA certificate for SSL/TLS (e.g., "/path/to/ca.crt"). | +| certPath | string | false | Path to the client certificate for SSL/TLS (e.g., "/path/to/client.crt"). | +| keyPath | string | false | Path to the client key for SSL/TLS (e.g., "/path/to/client.key"). | +| enableHostVerification | boolean | false | Enable host verification for SSL/TLS (e.g., true). By default, host verification is disabled. | diff --git a/docs/en/integrations/cassandra/tools/_index.md b/docs/en/integrations/cassandra/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/cassandra/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/cassandra/cassandra-cql.md b/docs/en/integrations/cassandra/tools/cassandra-cql.md similarity index 99% rename from docs/en/integrations/cassandra/cassandra-cql.md rename to docs/en/integrations/cassandra/tools/cassandra-cql.md index c4f920f15631..5878453f0a39 100644 --- a/docs/en/integrations/cassandra/cassandra-cql.md +++ b/docs/en/integrations/cassandra/tools/cassandra-cql.md @@ -1,5 +1,5 @@ --- -title: "cassandra-cql Tool" +title: "cassandra-cql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/clickhouse/_index.md b/docs/en/integrations/clickhouse/_index.md index 50a176435dd6..d25eec22f781 100644 --- a/docs/en/integrations/clickhouse/_index.md +++ b/docs/en/integrations/clickhouse/_index.md @@ -1,88 +1,4 @@ --- -title: "ClickHouse Source" -type: docs +title: "ClickHouse" weight: 1 -description: > - ClickHouse is an open-source, OLTP database. -no_list: true ---- - -## About - -[ClickHouse][clickhouse-docs] is a fast, open-source, column-oriented database - -[clickhouse-docs]: https://clickhouse.com/docs - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source uses standard ClickHouse authentication. You will need to [create a -ClickHouse user][clickhouse-users] (or with [ClickHouse -Cloud][clickhouse-cloud]) to connect to the database with. The user should have -appropriate permissions for the operations you plan to perform. - -[clickhouse-cloud]: - https://clickhouse.com/docs/getting-started/quick-start/cloud#connect-with-your-app -[clickhouse-users]: https://clickhouse.com/docs/en/sql-reference/statements/create/user - -### Network Access - -ClickHouse supports multiple protocols: - -- **HTTPS protocol** (default port 8443) - Secure HTTP access (default) -- **HTTP protocol** (default port 8123) - Good for web-based access - -## Example - -### Secure Connection Example - -```yaml -kind: sources -name: secure-clickhouse-source -type: clickhouse -host: clickhouse.example.com -port: "8443" -database: analytics -user: ${CLICKHOUSE_USER} -password: ${CLICKHOUSE_PASSWORD} -protocol: https -secure: true -``` - -### HTTP Protocol Example - -```yaml -kind: sources -name: http-clickhouse-source -type: clickhouse -host: localhost -port: "8123" -database: logs -user: ${CLICKHOUSE_USER} -password: ${CLICKHOUSE_PASSWORD} -protocol: http -secure: false -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|-------------------------------------------------------------------------------------| -| type | string | true | Must be "clickhouse". | -| host | string | true | IP address or hostname to connect to (e.g. "127.0.0.1" or "clickhouse.example.com") | -| port | string | true | Port to connect to (e.g. "8443" for HTTPS, "8123" for HTTP) | -| database | string | true | Name of the ClickHouse database to connect to (e.g. "my_database"). | -| user | string | true | Name of the ClickHouse user to connect as (e.g. "analytics_user"). | -| password | string | false | Password of the ClickHouse user (e.g. "my-password"). | -| protocol | string | false | Connection protocol: "https" (default) or "http". | -| secure | boolean | false | Whether to use a secure connection (TLS). Default: false. | +--- \ No newline at end of file diff --git a/docs/en/integrations/clickhouse/source.md b/docs/en/integrations/clickhouse/source.md new file mode 100644 index 000000000000..3f77c300bcaf --- /dev/null +++ b/docs/en/integrations/clickhouse/source.md @@ -0,0 +1,89 @@ +--- +title: "ClickHouse Source" +type: docs +weight: 1 +linkTitle: "Source" +description: > + ClickHouse is an open-source, OLTP database. +no_list: true +--- + +## About + +[ClickHouse][clickhouse-docs] is a fast, open-source, column-oriented database + +[clickhouse-docs]: https://clickhouse.com/docs + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source uses standard ClickHouse authentication. You will need to [create a +ClickHouse user][clickhouse-users] (or with [ClickHouse +Cloud][clickhouse-cloud]) to connect to the database with. The user should have +appropriate permissions for the operations you plan to perform. + +[clickhouse-cloud]: + https://clickhouse.com/docs/getting-started/quick-start/cloud#connect-with-your-app +[clickhouse-users]: https://clickhouse.com/docs/en/sql-reference/statements/create/user + +### Network Access + +ClickHouse supports multiple protocols: + +- **HTTPS protocol** (default port 8443) - Secure HTTP access (default) +- **HTTP protocol** (default port 8123) - Good for web-based access + +## Example + +### Secure Connection Example + +```yaml +kind: sources +name: secure-clickhouse-source +type: clickhouse +host: clickhouse.example.com +port: "8443" +database: analytics +user: ${CLICKHOUSE_USER} +password: ${CLICKHOUSE_PASSWORD} +protocol: https +secure: true +``` + +### HTTP Protocol Example + +```yaml +kind: sources +name: http-clickhouse-source +type: clickhouse +host: localhost +port: "8123" +database: logs +user: ${CLICKHOUSE_USER} +password: ${CLICKHOUSE_PASSWORD} +protocol: http +secure: false +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|-------------------------------------------------------------------------------------| +| type | string | true | Must be "clickhouse". | +| host | string | true | IP address or hostname to connect to (e.g. "127.0.0.1" or "clickhouse.example.com") | +| port | string | true | Port to connect to (e.g. "8443" for HTTPS, "8123" for HTTP) | +| database | string | true | Name of the ClickHouse database to connect to (e.g. "my_database"). | +| user | string | true | Name of the ClickHouse user to connect as (e.g. "analytics_user"). | +| password | string | false | Password of the ClickHouse user (e.g. "my-password"). | +| protocol | string | false | Connection protocol: "https" (default) or "http". | +| secure | boolean | false | Whether to use a secure connection (TLS). Default: false. | diff --git a/docs/en/integrations/clickhouse/tools/_index.md b/docs/en/integrations/clickhouse/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/clickhouse/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/clickhouse/clickhouse-execute-sql.md b/docs/en/integrations/clickhouse/tools/clickhouse-execute-sql.md similarity index 97% rename from docs/en/integrations/clickhouse/clickhouse-execute-sql.md rename to docs/en/integrations/clickhouse/tools/clickhouse-execute-sql.md index 2f6a448ac129..f4acddbab6ea 100644 --- a/docs/en/integrations/clickhouse/clickhouse-execute-sql.md +++ b/docs/en/integrations/clickhouse/tools/clickhouse-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "clickhouse-execute-sql Tool" +title: "clickhouse-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/clickhouse/clickhouse-list-databases.md b/docs/en/integrations/clickhouse/tools/clickhouse-list-databases.md similarity index 97% rename from docs/en/integrations/clickhouse/clickhouse-list-databases.md rename to docs/en/integrations/clickhouse/tools/clickhouse-list-databases.md index a483341dca7d..5df1b266cd27 100644 --- a/docs/en/integrations/clickhouse/clickhouse-list-databases.md +++ b/docs/en/integrations/clickhouse/tools/clickhouse-list-databases.md @@ -1,5 +1,5 @@ --- -title: "clickhouse-list-databases Tool" +title: "clickhouse-list-databases" type: docs weight: 3 description: > diff --git a/docs/en/integrations/clickhouse/clickhouse-list-tables.md b/docs/en/integrations/clickhouse/tools/clickhouse-list-tables.md similarity index 98% rename from docs/en/integrations/clickhouse/clickhouse-list-tables.md rename to docs/en/integrations/clickhouse/tools/clickhouse-list-tables.md index 48cc502a31b2..aacbd5c10757 100644 --- a/docs/en/integrations/clickhouse/clickhouse-list-tables.md +++ b/docs/en/integrations/clickhouse/tools/clickhouse-list-tables.md @@ -1,5 +1,5 @@ --- -title: "clickhouse-list-tables Tool" +title: "clickhouse-list-tables" type: docs weight: 4 description: > diff --git a/docs/en/integrations/clickhouse/clickhouse-sql.md b/docs/en/integrations/clickhouse/tools/clickhouse-sql.md similarity index 98% rename from docs/en/integrations/clickhouse/clickhouse-sql.md rename to docs/en/integrations/clickhouse/tools/clickhouse-sql.md index 2a114cbaa6e6..003ad3cf68a9 100644 --- a/docs/en/integrations/clickhouse/clickhouse-sql.md +++ b/docs/en/integrations/clickhouse/tools/clickhouse-sql.md @@ -1,5 +1,5 @@ --- -title: "clickhouse-sql Tool" +title: "clickhouse-sql" type: docs weight: 2 description: > diff --git a/docs/en/integrations/cloud-sql-admin/_index.md b/docs/en/integrations/cloud-sql-admin/_index.md index eaa1e31561c7..0764faabd1b0 100644 --- a/docs/en/integrations/cloud-sql-admin/_index.md +++ b/docs/en/integrations/cloud-sql-admin/_index.md @@ -1,47 +1,4 @@ --- -title: "Cloud SQL Admin Source" -type: docs +title: "Cloud SQL Admin" weight: 1 -description: "A \"cloud-sql-admin\" source provides a client for the Cloud SQL Admin API.\n" -no_list: true ---- - -## About - -The `cloud-sql-admin` source provides a client to interact with the [Google -Cloud SQL Admin API](https://cloud.google.com/sql/docs/mysql/admin-api). This -allows tools to perform administrative tasks on Cloud SQL instances, such as -creating users and databases. - -Authentication can be handled in two ways: - -1. **Application Default Credentials (ADC):** By default, the source uses ADC - to authenticate with the API. -2. **Client-side OAuth:** If `useClientOAuth` is set to `true`, the source will - expect an OAuth 2.0 access token to be provided by the client (e.g., a web - browser) for each request. - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-cloud-sql-admin -type: cloud-sql-admin ---- -kind: sources -name: my-oauth-cloud-sql-admin -type: cloud-sql-admin -useClientOAuth: true -``` - -## Reference - -| **field** | **type** | **required** | **description** | -| -------------- | :------: | :----------: | ---------------------------------------------------------------------------------------------------------------------------------------------- | -| type | string | true | Must be "cloud-sql-admin". | -| defaultProject | string | false | The Google Cloud project ID to use for Cloud SQL infrastructure tools. | -| useClientOAuth | boolean | false | If true, the source will use client-side OAuth for authorization. Otherwise, it will use Application Default Credentials. Defaults to `false`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/cloud-sql-admin/source.md b/docs/en/integrations/cloud-sql-admin/source.md new file mode 100644 index 000000000000..5e0b9706f2eb --- /dev/null +++ b/docs/en/integrations/cloud-sql-admin/source.md @@ -0,0 +1,48 @@ +--- +title: "Cloud SQL Admin Source" +type: docs +linkTitle: "Source" +weight: 1 +description: "A \"cloud-sql-admin\" source provides a client for the Cloud SQL Admin API.\n" +no_list: true +--- + +## About + +The `cloud-sql-admin` source provides a client to interact with the [Google +Cloud SQL Admin API](https://cloud.google.com/sql/docs/mysql/admin-api). This +allows tools to perform administrative tasks on Cloud SQL instances, such as +creating users and databases. + +Authentication can be handled in two ways: + +1. **Application Default Credentials (ADC):** By default, the source uses ADC + to authenticate with the API. +2. **Client-side OAuth:** If `useClientOAuth` is set to `true`, the source will + expect an OAuth 2.0 access token to be provided by the client (e.g., a web + browser) for each request. + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-cloud-sql-admin +type: cloud-sql-admin +--- +kind: sources +name: my-oauth-cloud-sql-admin +type: cloud-sql-admin +useClientOAuth: true +``` + +## Reference + +| **field** | **type** | **required** | **description** | +| -------------- | :------: | :----------: | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| type | string | true | Must be "cloud-sql-admin". | +| defaultProject | string | false | The Google Cloud project ID to use for Cloud SQL infrastructure tools. | +| useClientOAuth | boolean | false | If true, the source will use client-side OAuth for authorization. Otherwise, it will use Application Default Credentials. Defaults to `false`. | diff --git a/docs/en/integrations/cloud-sql-admin/tools/_index.md b/docs/en/integrations/cloud-sql-admin/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/cloud-sql-admin/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlcloneinstance.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlcloneinstance.md similarity index 98% rename from docs/en/integrations/cloud-sql-admin/cloudsqlcloneinstance.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlcloneinstance.md index b1d224066ae4..0ebcb75da3cc 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlcloneinstance.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlcloneinstance.md @@ -1,5 +1,5 @@ --- -title: cloud-sql-clone-instance Tool +title: cloud-sql-clone-instance type: docs weight: 10 description: "Clone a Cloud SQL instance." diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlcreatebackup.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlcreatebackup.md similarity index 98% rename from docs/en/integrations/cloud-sql-admin/cloudsqlcreatebackup.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlcreatebackup.md index 0f1f8443dab0..733e29c8461b 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlcreatebackup.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlcreatebackup.md @@ -1,5 +1,5 @@ --- -title: cloud-sql-create-backup Tool +title: cloud-sql-create-backup type: docs weight: 10 description: "Creates a backup on a Cloud SQL instance." diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlcreatedatabase.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlcreatedatabase.md similarity index 97% rename from docs/en/integrations/cloud-sql-admin/cloudsqlcreatedatabase.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlcreatedatabase.md index 00d7e6a8ea02..dd525e8b4cf9 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlcreatedatabase.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlcreatedatabase.md @@ -1,5 +1,5 @@ --- -title: cloud-sql-create-database Tool +title: cloud-sql-create-database type: docs weight: 10 description: > diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlcreateusers.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlcreateusers.md similarity index 97% rename from docs/en/integrations/cloud-sql-admin/cloudsqlcreateusers.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlcreateusers.md index 20f7f6c113a5..559550ad23fe 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlcreateusers.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlcreateusers.md @@ -1,5 +1,5 @@ --- -title: cloud-sql-create-users Tool +title: cloud-sql-create-users type: docs weight: 10 description: > diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlgetinstances.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlgetinstances.md similarity index 96% rename from docs/en/integrations/cloud-sql-admin/cloudsqlgetinstances.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlgetinstances.md index adf91049be5c..738edea1b8fc 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlgetinstances.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlgetinstances.md @@ -1,5 +1,5 @@ --- -title: "cloud-sql-get-instance Tool" +title: "cloud-sql-get-instance" type: docs weight: 10 description: > diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqllistdatabases.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqllistdatabases.md similarity index 97% rename from docs/en/integrations/cloud-sql-admin/cloudsqllistdatabases.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqllistdatabases.md index ccadccc1598f..0685c42f2fea 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqllistdatabases.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqllistdatabases.md @@ -1,5 +1,5 @@ --- -title: cloud-sql-list-databases Tool +title: cloud-sql-list-databases type: docs weight: 1 description: List Cloud SQL databases in an instance. diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqllistinstances.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqllistinstances.md similarity index 97% rename from docs/en/integrations/cloud-sql-admin/cloudsqllistinstances.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqllistinstances.md index c09070baa572..3b45d7016e5a 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqllistinstances.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqllistinstances.md @@ -1,5 +1,5 @@ --- -title: cloud-sql-list-instances Tool +title: cloud-sql-list-instances type: docs weight: 1 description: "List Cloud SQL instances in a project.\n" diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlmssqlcreateinstance.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlmssqlcreateinstance.md similarity index 98% rename from docs/en/integrations/cloud-sql-admin/cloudsqlmssqlcreateinstance.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlmssqlcreateinstance.md index 4d66df1d9891..aff9f0f44f9c 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlmssqlcreateinstance.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlmssqlcreateinstance.md @@ -1,5 +1,5 @@ --- -title: cloud-sql-mssql-create-instance Tool +title: cloud-sql-mssql-create-instance type: docs weight: 10 description: "Create a Cloud SQL for SQL Server instance." diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlmysqlcreateinstance.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlmysqlcreateinstance.md similarity index 98% rename from docs/en/integrations/cloud-sql-admin/cloudsqlmysqlcreateinstance.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlmysqlcreateinstance.md index ca31ad5d0ebd..d1155974bffb 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlmysqlcreateinstance.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlmysqlcreateinstance.md @@ -1,5 +1,5 @@ --- -title: cloud-sql-mysql-create-instance Tool +title: cloud-sql-mysql-create-instance type: docs weight: 2 description: "Create a Cloud SQL for MySQL instance." diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlpgcreateinstances.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlpgcreateinstances.md similarity index 98% rename from docs/en/integrations/cloud-sql-admin/cloudsqlpgcreateinstances.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlpgcreateinstances.md index 566b74af7e34..a0981d3b80ff 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlpgcreateinstances.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlpgcreateinstances.md @@ -1,5 +1,5 @@ --- -title: cloud-sql-postgres-create-instance Tool +title: cloud-sql-postgres-create-instance type: docs weight: 10 description: Create a Cloud SQL for PostgreSQL instance. diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlpgupgradeprecheck.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlpgupgradeprecheck.md similarity index 98% rename from docs/en/integrations/cloud-sql-admin/cloudsqlpgupgradeprecheck.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlpgupgradeprecheck.md index 65694717fedc..d67d590e3346 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlpgupgradeprecheck.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlpgupgradeprecheck.md @@ -1,5 +1,5 @@ --- -title: postgres-upgrade-precheck Tool +title: postgres-upgrade-precheck type: docs weight: 11 description: Perform a pre-check for a Cloud SQL for PostgreSQL major version upgrade. diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlrestorebackup.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlrestorebackup.md similarity index 98% rename from docs/en/integrations/cloud-sql-admin/cloudsqlrestorebackup.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlrestorebackup.md index 108734afdb97..70816e370d10 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlrestorebackup.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlrestorebackup.md @@ -1,5 +1,5 @@ --- -title: cloud-sql-restore-backup Tool +title: cloud-sql-restore-backup type: docs weight: 10 description: "Restores a backup of a Cloud SQL instance." diff --git a/docs/en/integrations/cloud-sql-admin/cloudsqlwaitforoperation.md b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlwaitforoperation.md similarity index 98% rename from docs/en/integrations/cloud-sql-admin/cloudsqlwaitforoperation.md rename to docs/en/integrations/cloud-sql-admin/tools/cloudsqlwaitforoperation.md index 8d85521fcbfc..815c793773b9 100644 --- a/docs/en/integrations/cloud-sql-admin/cloudsqlwaitforoperation.md +++ b/docs/en/integrations/cloud-sql-admin/tools/cloudsqlwaitforoperation.md @@ -1,5 +1,5 @@ --- -title: "cloud-sql-wait-for-operation Tool" +title: "cloud-sql-wait-for-operation" type: docs weight: 10 description: > diff --git a/docs/en/integrations/cloud-sql-mssql/_index.md b/docs/en/integrations/cloud-sql-mssql/_index.md index 0978e3898998..b4ce93d5d25f 100644 --- a/docs/en/integrations/cloud-sql-mssql/_index.md +++ b/docs/en/integrations/cloud-sql-mssql/_index.md @@ -1,113 +1,4 @@ --- -title: "Cloud SQL for SQL Server Source" -linkTitle: "Cloud SQL (SQL Server)" -type: docs +title: "Cloud SQL for SQL Server" weight: 1 -description: > - Cloud SQL for SQL Server is a fully-managed database service for SQL Server. -no_list: true ---- - -## About - -[Cloud SQL for SQL Server][csql-mssql-docs] is a managed database service that -helps you set up, maintain, manage, and administer your SQL Server databases on -Google Cloud. - -If you are new to Cloud SQL for SQL Server, you can try [creating and connecting -to a database by following these instructions][csql-mssql-connect]. - -[csql-mssql-docs]: https://cloud.google.com/sql/docs/sqlserver -[csql-mssql-connect]: https://cloud.google.com/sql/docs/sqlserver/connect-overview - -## Available Tools - -{{< list-tools dirs="/integrations/mssql" >}} - - -### Pre-built Configurations - -- [Cloud SQL for SQL Server using MCP](../../user-guide/connect-to/ides/cloud_sql_mssql_mcp.md) -Connect your IDE to Cloud SQL for SQL Server using Toolbox. - -## Requirements - -### IAM Permissions - -By default, this source uses the [Cloud SQL Go Connector][csql-go-conn] to -authorize and establish mTLS connections to your Cloud SQL instance. The Go -connector uses your [Application Default Credentials (ADC)][adc] to authorize -your connection to Cloud SQL. - -In addition to [setting the ADC for your server][set-adc], you need to ensure -the IAM identity has been given the following IAM roles (or corresponding -permissions): - -- `roles/cloudsql.client` - -{{< notice tip >}} -If you are connecting from Compute Engine, make sure your VM -also has the [proper -scope](https://cloud.google.com/compute/docs/access/service-accounts#accesscopesiam) -to connect using the Cloud SQL Admin API. -{{< /notice >}} - -[csql-go-conn]: https://github.com/GoogleCloudPlatform/cloud-sql-go-connector -[adc]: https://cloud.google.com/docs/authentication#adc -[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc - -### Networking - -Cloud SQL supports connecting over both from external networks via the internet -([public IP][public-ip]), and internal networks ([private IP][private-ip]). -For more information on choosing between the two options, see the Cloud SQL page -[Connection overview][conn-overview]. - -You can configure the `ipType` parameter in your source configuration to -`public` or `private` to match your cluster's configuration. Regardless of which -you choose, all connections use IAM-based authorization and are encrypted with -mTLS. - -[private-ip]: https://cloud.google.com/sql/docs/sqlserver/configure-private-ip -[public-ip]: https://cloud.google.com/sql/docs/sqlserver/configure-ip -[conn-overview]: https://cloud.google.com/sql/docs/sqlserver/connect-overview - -### Database User - -Currently, this source only uses standard authentication. You will need to -[create a SQL Server user][cloud-sql-users] to login to the database with. - -[cloud-sql-users]: https://cloud.google.com/sql/docs/sqlserver/create-manage-users - -## Example - -```yaml -kind: sources -name: my-cloud-sql-mssql-instance -type: cloud-sql-mssql -project: my-project -region: my-region -instance: my-instance -database: my_db -user: ${USER_NAME} -password: ${PASSWORD} -# ipType: private -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "cloud-sql-mssql". | -| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | -| region | string | true | Name of the GCP region that the cluster was created in (e.g. "us-central1"). | -| instance | string | true | Name of the Cloud SQL instance within the cluster (e.g. "my-instance"). | -| database | string | true | Name of the Cloud SQL database to connect to (e.g. "my_db"). | -| user | string | true | Name of the SQL Server user to connect as (e.g. "my-pg-user"). | -| password | string | true | Password of the SQL Server user (e.g. "my-password"). | -| ipType | string | false | IP Type of the Cloud SQL instance, must be either `public`, `private`, or `psc`. Default: `public`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/cloud-sql-mssql/source.md b/docs/en/integrations/cloud-sql-mssql/source.md new file mode 100644 index 000000000000..d819938c6b9f --- /dev/null +++ b/docs/en/integrations/cloud-sql-mssql/source.md @@ -0,0 +1,113 @@ +--- +title: "Cloud SQL for SQL Server Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Cloud SQL for SQL Server is a fully-managed database service for SQL Server. +no_list: true +--- + +## About + +[Cloud SQL for SQL Server][csql-mssql-docs] is a managed database service that +helps you set up, maintain, manage, and administer your SQL Server databases on +Google Cloud. + +If you are new to Cloud SQL for SQL Server, you can try [creating and connecting +to a database by following these instructions][csql-mssql-connect]. + +[csql-mssql-docs]: https://cloud.google.com/sql/docs/sqlserver +[csql-mssql-connect]: https://cloud.google.com/sql/docs/sqlserver/connect-overview + +## Available Tools + +{{< list-tools dirs="/integrations/mssql/tools" >}} + + +### Pre-built Configurations + +- [Cloud SQL for SQL Server using MCP](../../documentation/connect-to/ides/cloud_sql_mssql_mcp.md) +Connect your IDE to Cloud SQL for SQL Server using Toolbox. + +## Requirements + +### IAM Permissions + +By default, this source uses the [Cloud SQL Go Connector][csql-go-conn] to +authorize and establish mTLS connections to your Cloud SQL instance. The Go +connector uses your [Application Default Credentials (ADC)][adc] to authorize +your connection to Cloud SQL. + +In addition to [setting the ADC for your server][set-adc], you need to ensure +the IAM identity has been given the following IAM roles (or corresponding +permissions): + +- `roles/cloudsql.client` + +{{< notice tip >}} +If you are connecting from Compute Engine, make sure your VM +also has the [proper +scope](https://cloud.google.com/compute/docs/access/service-accounts#accesscopesiam) +to connect using the Cloud SQL Admin API. +{{< /notice >}} + +[csql-go-conn]: https://github.com/GoogleCloudPlatform/cloud-sql-go-connector +[adc]: https://cloud.google.com/docs/authentication#adc +[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc + +### Networking + +Cloud SQL supports connecting over both from external networks via the internet +([public IP][public-ip]), and internal networks ([private IP][private-ip]). +For more information on choosing between the two options, see the Cloud SQL page +[Connection overview][conn-overview]. + +You can configure the `ipType` parameter in your source configuration to +`public` or `private` to match your cluster's configuration. Regardless of which +you choose, all connections use IAM-based authorization and are encrypted with +mTLS. + +[private-ip]: https://cloud.google.com/sql/docs/sqlserver/configure-private-ip +[public-ip]: https://cloud.google.com/sql/docs/sqlserver/configure-ip +[conn-overview]: https://cloud.google.com/sql/docs/sqlserver/connect-overview + +### Database User + +Currently, this source only uses standard authentication. You will need to +[create a SQL Server user][cloud-sql-users] to login to the database with. + +[cloud-sql-users]: https://cloud.google.com/sql/docs/sqlserver/create-manage-users + +## Example + +```yaml +kind: sources +name: my-cloud-sql-mssql-instance +type: cloud-sql-mssql +project: my-project +region: my-region +instance: my-instance +database: my_db +user: ${USER_NAME} +password: ${PASSWORD} +# ipType: private +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "cloud-sql-mssql". | +| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | +| region | string | true | Name of the GCP region that the cluster was created in (e.g. "us-central1"). | +| instance | string | true | Name of the Cloud SQL instance within the cluster (e.g. "my-instance"). | +| database | string | true | Name of the Cloud SQL database to connect to (e.g. "my_db"). | +| user | string | true | Name of the SQL Server user to connect as (e.g. "my-pg-user"). | +| password | string | true | Password of the SQL Server user (e.g. "my-password"). | +| ipType | string | false | IP Type of the Cloud SQL instance, must be either `public`, `private`, or `psc`. Default: `public`. | diff --git a/docs/en/integrations/cloud-sql-mssql/tools/_index.md b/docs/en/integrations/cloud-sql-mssql/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/cloud-sql-mssql/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/cloud-sql-mssql/tools/mssql-tools.md b/docs/en/integrations/cloud-sql-mssql/tools/mssql-tools.md new file mode 100644 index 000000000000..ea2073d9fc3e --- /dev/null +++ b/docs/en/integrations/cloud-sql-mssql/tools/mssql-tools.md @@ -0,0 +1,8 @@ +--- +title: "MSSQL Tools" +weight: 90 +type: docs +is_wrapper: true +--- + +{{< list-tools dirs="integrations/mssql/tools" >}} \ No newline at end of file diff --git a/docs/en/integrations/cloud-sql-mysql/_index.md b/docs/en/integrations/cloud-sql-mysql/_index.md index f84f25f487cc..5425f0a3983c 100644 --- a/docs/en/integrations/cloud-sql-mysql/_index.md +++ b/docs/en/integrations/cloud-sql-mysql/_index.md @@ -1,141 +1,4 @@ --- -title: "Cloud SQL for MySQL Source" -linkTitle: "Cloud SQL (MySQL)" -type: docs +title: "Cloud SQL for MySQL" weight: 1 -description: > - Cloud SQL for MySQL is a fully-managed database service for MySQL. -no_list: true ---- - -## About - -[Cloud SQL for MySQL][csql-mysql-docs] is a fully-managed database service -that helps you set up, maintain, manage, and administer your MySQL -relational databases on Google Cloud Platform. - -If you are new to Cloud SQL for MySQL, you can try [creating and connecting -to a database by following these instructions][csql-mysql-quickstart]. - -[csql-mysql-docs]: https://cloud.google.com/sql/docs/mysql -[csql-mysql-quickstart]: https://cloud.google.com/sql/docs/mysql/connect-instance-local-computer - -## Available Tools - -{{< list-tools dirs="/integrations/mysql" >}} - - -### Pre-built Configurations - -- [Cloud SQL for MySQL using - MCP](https://googleapis.github.io/genai-toolbox/how-to/connect-ide/cloud_sql_mysql_mcp/) - Connect your IDE to Cloud SQL for MySQL using Toolbox. - -## Requirements - -### IAM Permissions - -By default, this source uses the [Cloud SQL Go Connector][csql-go-conn] to -authorize and establish mTLS connections to your Cloud SQL instance. The Go -connector uses your [Application Default Credentials (ADC)][adc] to authorize -your connection to Cloud SQL. - -In addition to [setting the ADC for your server][set-adc], you need to ensure -the IAM identity has been given the following IAM roles (or corresponding -permissions): - -- `roles/cloudsql.client` - -{{< notice tip >}} -If you are connecting from Compute Engine, make sure your VM -also has the [proper -scope](https://cloud.google.com/compute/docs/access/service-accounts#accesscopesiam) -to connect using the Cloud SQL Admin API. -{{< /notice >}} - -[csql-go-conn]: https://github.com/GoogleCloudPlatform/cloud-sql-go-connector -[adc]: https://cloud.google.com/docs/authentication#adc -[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc - -### Networking - -Cloud SQL supports connecting over both from external networks via the internet -([public IP][public-ip]), and internal networks ([private IP][private-ip]). -For more information on choosing between the two options, see the Cloud SQL page -[Connection overview][conn-overview]. - -You can configure the `ipType` parameter in your source configuration to -`public` or `private` to match your cluster's configuration. Regardless of which -you choose, all connections use IAM-based authorization and are encrypted with -mTLS. - -[private-ip]: https://cloud.google.com/sql/docs/mysql/configure-private-ip -[public-ip]: https://cloud.google.com/sql/docs/mysql/configure-ip -[conn-overview]: https://cloud.google.com/sql/docs/mysql/connect-overview - -### Authentication - -This source supports both password-based authentication and IAM -authentication (using your [Application Default Credentials][adc]). - -#### Standard Authentication - -To connect using user/password, [create -a MySQL user][cloud-sql-users] and input your credentials in the `user` and -`password` fields. - -```yaml -user: ${USER_NAME} -password: ${PASSWORD} -``` - -[cloud-sql-users]: https://cloud.google.com/sql/docs/mysql/create-manage-users - -#### IAM Authentication - -To connect using IAM authentication: - -1. Prepare your database instance and user following this [guide][iam-guide]. -2. You could choose one of the two ways to log in: - - Specify your IAM email as the `user`. - - Leave your `user` field blank. Toolbox will fetch the [ADC][adc] - automatically and log in using the email associated with it. - -3. Leave the `password` field blank. - -[iam-guide]: https://cloud.google.com/sql/docs/mysql/iam-logins -[cloudsql-users]: https://cloud.google.com/sql/docs/mysql/create-manage-users - - -## Example - -```yaml -kind: sources -name: my-cloud-sql-mysql-source -type: cloud-sql-mysql -project: my-project-id -region: us-central1 -instance: my-instance -database: my_db -user: ${USER_NAME} -password: ${PASSWORD} -# ipType: "private" -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "cloud-sql-mysql". | -| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | -| region | string | true | Name of the GCP region that the cluster was created in (e.g. "us-central1"). | -| instance | string | true | Name of the Cloud SQL instance within the cluster (e.g. "my-instance"). | -| database | string | true | Name of the MySQL database to connect to (e.g. "my_db"). | -| user | string | false | Name of the MySQL user to connect as (e.g "my-mysql-user"). Defaults to IAM auth using [ADC][adc] email if unspecified. | -| password | string | false | Password of the MySQL user (e.g. "my-password"). Defaults to attempting IAM authentication if unspecified. | -| ipType | string | false | IP Type of the Cloud SQL instance, must be either `public`, `private`, or `psc`. Default: `public`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/cloud-sql-mysql/source.md b/docs/en/integrations/cloud-sql-mysql/source.md new file mode 100644 index 000000000000..20d13aba6364 --- /dev/null +++ b/docs/en/integrations/cloud-sql-mysql/source.md @@ -0,0 +1,141 @@ +--- +title: "Cloud SQL for MySQL Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Cloud SQL for MySQL is a fully-managed database service for MySQL. +no_list: true +--- + +## About + +[Cloud SQL for MySQL][csql-mysql-docs] is a fully-managed database service +that helps you set up, maintain, manage, and administer your MySQL +relational databases on Google Cloud Platform. + +If you are new to Cloud SQL for MySQL, you can try [creating and connecting +to a database by following these instructions][csql-mysql-quickstart]. + +[csql-mysql-docs]: https://cloud.google.com/sql/docs/mysql +[csql-mysql-quickstart]: https://cloud.google.com/sql/docs/mysql/connect-instance-local-computer + +## Available Tools + +{{< list-tools dirs="/integrations/mysql/tools" >}} + + +### Pre-built Configurations + +- [Cloud SQL for MySQL using + MCP](https://googleapis.github.io/genai-toolbox/how-to/connect-ide/cloud_sql_mysql_mcp/) + Connect your IDE to Cloud SQL for MySQL using Toolbox. + +## Requirements + +### IAM Permissions + +By default, this source uses the [Cloud SQL Go Connector][csql-go-conn] to +authorize and establish mTLS connections to your Cloud SQL instance. The Go +connector uses your [Application Default Credentials (ADC)][adc] to authorize +your connection to Cloud SQL. + +In addition to [setting the ADC for your server][set-adc], you need to ensure +the IAM identity has been given the following IAM roles (or corresponding +permissions): + +- `roles/cloudsql.client` + +{{< notice tip >}} +If you are connecting from Compute Engine, make sure your VM +also has the [proper +scope](https://cloud.google.com/compute/docs/access/service-accounts#accesscopesiam) +to connect using the Cloud SQL Admin API. +{{< /notice >}} + +[csql-go-conn]: https://github.com/GoogleCloudPlatform/cloud-sql-go-connector +[adc]: https://cloud.google.com/docs/authentication#adc +[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc + +### Networking + +Cloud SQL supports connecting over both from external networks via the internet +([public IP][public-ip]), and internal networks ([private IP][private-ip]). +For more information on choosing between the two options, see the Cloud SQL page +[Connection overview][conn-overview]. + +You can configure the `ipType` parameter in your source configuration to +`public` or `private` to match your cluster's configuration. Regardless of which +you choose, all connections use IAM-based authorization and are encrypted with +mTLS. + +[private-ip]: https://cloud.google.com/sql/docs/mysql/configure-private-ip +[public-ip]: https://cloud.google.com/sql/docs/mysql/configure-ip +[conn-overview]: https://cloud.google.com/sql/docs/mysql/connect-overview + +### Authentication + +This source supports both password-based authentication and IAM +authentication (using your [Application Default Credentials][adc]). + +#### Standard Authentication + +To connect using user/password, [create +a MySQL user][cloud-sql-users] and input your credentials in the `user` and +`password` fields. + +```yaml +user: ${USER_NAME} +password: ${PASSWORD} +``` + +[cloud-sql-users]: https://cloud.google.com/sql/docs/mysql/create-manage-users + +#### IAM Authentication + +To connect using IAM authentication: + +1. Prepare your database instance and user following this [guide][iam-guide]. +2. You could choose one of the two ways to log in: + - Specify your IAM email as the `user`. + - Leave your `user` field blank. Toolbox will fetch the [ADC][adc] + automatically and log in using the email associated with it. + +3. Leave the `password` field blank. + +[iam-guide]: https://cloud.google.com/sql/docs/mysql/iam-logins +[cloudsql-users]: https://cloud.google.com/sql/docs/mysql/create-manage-users + + +## Example + +```yaml +kind: sources +name: my-cloud-sql-mysql-source +type: cloud-sql-mysql +project: my-project-id +region: us-central1 +instance: my-instance +database: my_db +user: ${USER_NAME} +password: ${PASSWORD} +# ipType: "private" +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "cloud-sql-mysql". | +| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | +| region | string | true | Name of the GCP region that the cluster was created in (e.g. "us-central1"). | +| instance | string | true | Name of the Cloud SQL instance within the cluster (e.g. "my-instance"). | +| database | string | true | Name of the MySQL database to connect to (e.g. "my_db"). | +| user | string | false | Name of the MySQL user to connect as (e.g "my-mysql-user"). Defaults to IAM auth using [ADC][adc] email if unspecified. | +| password | string | false | Password of the MySQL user (e.g. "my-password"). Defaults to attempting IAM authentication if unspecified. | +| ipType | string | false | IP Type of the Cloud SQL instance, must be either `public`, `private`, or `psc`. Default: `public`. | diff --git a/docs/en/integrations/cloud-sql-mysql/tools/_index.md b/docs/en/integrations/cloud-sql-mysql/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/cloud-sql-mysql/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/cloud-sql-mysql/tools/mysql-tools.md b/docs/en/integrations/cloud-sql-mysql/tools/mysql-tools.md new file mode 100644 index 000000000000..df54df8ded7d --- /dev/null +++ b/docs/en/integrations/cloud-sql-mysql/tools/mysql-tools.md @@ -0,0 +1,8 @@ +--- +title: "MySQL Tools" +weight: 90 +type: docs +is_wrapper: true +--- + +{{< list-tools dirs="integrations/mysql/tools" >}} \ No newline at end of file diff --git a/docs/en/integrations/cloud-sql-pg/_index.md b/docs/en/integrations/cloud-sql-pg/_index.md index c78130c36f90..bc71dc1d3d4b 100644 --- a/docs/en/integrations/cloud-sql-pg/_index.md +++ b/docs/en/integrations/cloud-sql-pg/_index.md @@ -1,147 +1,4 @@ --- -title: "Cloud SQL for PostgreSQL Source" -linkTitle: "Cloud SQL (Postgres)" -type: docs +title: "Cloud SQL for PostgreSQL" weight: 1 -description: > - Cloud SQL for PostgreSQL is a fully-managed database service for Postgres. -no_list: true ---- - -## About - -[Cloud SQL for PostgreSQL][csql-pg-docs] is a fully-managed database service -that helps you set up, maintain, manage, and administer your PostgreSQL -relational databases on Google Cloud Platform. - -If you are new to Cloud SQL for PostgreSQL, you can try [creating and connecting -to a database by following these instructions][csql-pg-quickstart]. - -[csql-pg-docs]: https://cloud.google.com/sql/docs/postgres -[csql-pg-quickstart]: - https://cloud.google.com/sql/docs/postgres/connect-instance-local-computer - -## Available Tools - -{{< list-tools dirs="/integrations/postgres" >}} - -### Pre-built Configurations - -- [Cloud SQL for Postgres using - MCP](https://googleapis.github.io/genai-toolbox/how-to/connect-ide/cloud_sql_pg_mcp/) -Connect your IDE to Cloud SQL for Postgres using Toolbox. - -## Requirements - -### IAM Permissions - -By default, this source uses the [Cloud SQL Go Connector][csql-go-conn] to -authorize and establish mTLS connections to your Cloud SQL instance. The Go -connector uses your [Application Default Credentials (ADC)][adc] to authorize -your connection to Cloud SQL. - -In addition to [setting the ADC for your server][set-adc], you need to ensure -the IAM identity has been given the following IAM roles (or corresponding -permissions): - -- `roles/cloudsql.client` - -{{< notice tip >}} -If you are connecting from Compute Engine, make sure your VM -also has the [proper -scope](https://cloud.google.com/compute/docs/access/service-accounts#accesscopesiam) -to connect using the Cloud SQL Admin API. -{{< /notice >}} - -[csql-go-conn]: -[adc]: -[set-adc]: - -### Networking - -Cloud SQL supports connecting over both from external networks via the internet -([public IP][public-ip]), and internal networks ([private IP][private-ip]). -For more information on choosing between the two options, see the Cloud SQL page -[Connection overview][conn-overview]. - -You can configure the `ipType` parameter in your source configuration to -`public` or `private` to match your cluster's configuration. Regardless of which -you choose, all connections use IAM-based authorization and are encrypted with -mTLS. - -[private-ip]: https://cloud.google.com/sql/docs/postgres/configure-private-ip -[public-ip]: https://cloud.google.com/sql/docs/postgres/configure-ip -[conn-overview]: https://cloud.google.com/sql/docs/postgres/connect-overview - -### Authentication - -This source supports both password-based authentication and IAM -authentication (using your [Application Default Credentials][adc]). - -#### Standard Authentication - -To connect using user/password, [create -a PostgreSQL user][cloudsql-users] and input your credentials in the `user` and -`password` fields. - -```yaml -user: ${USER_NAME} -password: ${PASSWORD} -``` - -#### IAM Authentication - -To connect using IAM authentication: - -1. Prepare your database instance and user following this [guide][iam-guide]. -2. You could choose one of the two ways to log in: - - Specify your IAM email as the `user`. - - Leave your `user` field blank. Toolbox will fetch the [ADC][adc] - automatically and log in using the email associated with it. - -3. Leave the `password` field blank. - -[iam-guide]: https://cloud.google.com/sql/docs/postgres/iam-logins -[cloudsql-users]: https://cloud.google.com/sql/docs/postgres/create-manage-users - -## Example - -```yaml -kind: sources -name: my-cloud-sql-pg-source -type: cloud-sql-postgres -project: my-project-id -region: us-central1 -instance: my-instance -database: my_db -user: ${USER_NAME} -password: ${PASSWORD} -# ipType: "private" -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -### Managed Connection Pooling - -Toolbox automatically supports [Managed Connection Pooling][csql-mcp]. If your Cloud SQL for PostgreSQL instance has Managed Connection Pooling enabled, the connection will immediately benefit from increased throughput and reduced latency. - -The interface is identical, so there's no additional configuration required on the client. For more information on configuring your instance, see the [Cloud SQL Managed Connection Pooling documentation][csql-mcp-docs]. - -[csql-mcp]: https://docs.cloud.google.com/sql/docs/postgres/managed-connection-pooling -[csql-mcp-docs]: https://docs.cloud.google.com/sql/docs/postgres/configure-mcp - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|--------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "cloud-sql-postgres". | -| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | -| region | string | true | Name of the GCP region that the cluster was created in (e.g. "us-central1"). | -| instance | string | true | Name of the Cloud SQL instance within the cluster (e.g. "my-instance"). | -| database | string | true | Name of the Postgres database to connect to (e.g. "my_db"). | -| user | string | false | Name of the Postgres user to connect as (e.g. "my-pg-user"). Defaults to IAM auth using [ADC][adc] email if unspecified. | -| password | string | false | Password of the Postgres user (e.g. "my-password"). Defaults to attempting IAM authentication if unspecified. | -| ipType | string | false | IP Type of the Cloud SQL instance; must be one of `public`, `private`, or `psc`. Default: `public`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/cloud-sql-pg/source.md b/docs/en/integrations/cloud-sql-pg/source.md new file mode 100644 index 000000000000..fd71352cb167 --- /dev/null +++ b/docs/en/integrations/cloud-sql-pg/source.md @@ -0,0 +1,147 @@ +--- +title: "Cloud SQL for PostgreSQL Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Cloud SQL for PostgreSQL is a fully-managed database service for Postgres. +no_list: true +--- + +## About + +[Cloud SQL for PostgreSQL][csql-pg-docs] is a fully-managed database service +that helps you set up, maintain, manage, and administer your PostgreSQL +relational databases on Google Cloud Platform. + +If you are new to Cloud SQL for PostgreSQL, you can try [creating and connecting +to a database by following these instructions][csql-pg-quickstart]. + +[csql-pg-docs]: https://cloud.google.com/sql/docs/postgres +[csql-pg-quickstart]: + https://cloud.google.com/sql/docs/postgres/connect-instance-local-computer + +## Available Tools + +{{< list-tools dirs="/integrations/postgres/tools" >}} + +### Pre-built Configurations + +- [Cloud SQL for Postgres using + MCP](https://googleapis.github.io/genai-toolbox/how-to/connect-ide/cloud_sql_pg_mcp/) +Connect your IDE to Cloud SQL for Postgres using Toolbox. + +## Requirements + +### IAM Permissions + +By default, this source uses the [Cloud SQL Go Connector][csql-go-conn] to +authorize and establish mTLS connections to your Cloud SQL instance. The Go +connector uses your [Application Default Credentials (ADC)][adc] to authorize +your connection to Cloud SQL. + +In addition to [setting the ADC for your server][set-adc], you need to ensure +the IAM identity has been given the following IAM roles (or corresponding +permissions): + +- `roles/cloudsql.client` + +{{< notice tip >}} +If you are connecting from Compute Engine, make sure your VM +also has the [proper +scope](https://cloud.google.com/compute/docs/access/service-accounts#accesscopesiam) +to connect using the Cloud SQL Admin API. +{{< /notice >}} + +[csql-go-conn]: +[adc]: +[set-adc]: + +### Networking + +Cloud SQL supports connecting over both from external networks via the internet +([public IP][public-ip]), and internal networks ([private IP][private-ip]). +For more information on choosing between the two options, see the Cloud SQL page +[Connection overview][conn-overview]. + +You can configure the `ipType` parameter in your source configuration to +`public` or `private` to match your cluster's configuration. Regardless of which +you choose, all connections use IAM-based authorization and are encrypted with +mTLS. + +[private-ip]: https://cloud.google.com/sql/docs/postgres/configure-private-ip +[public-ip]: https://cloud.google.com/sql/docs/postgres/configure-ip +[conn-overview]: https://cloud.google.com/sql/docs/postgres/connect-overview + +### Authentication + +This source supports both password-based authentication and IAM +authentication (using your [Application Default Credentials][adc]). + +#### Standard Authentication + +To connect using user/password, [create +a PostgreSQL user][cloudsql-users] and input your credentials in the `user` and +`password` fields. + +```yaml +user: ${USER_NAME} +password: ${PASSWORD} +``` + +#### IAM Authentication + +To connect using IAM authentication: + +1. Prepare your database instance and user following this [guide][iam-guide]. +2. You could choose one of the two ways to log in: + - Specify your IAM email as the `user`. + - Leave your `user` field blank. Toolbox will fetch the [ADC][adc] + automatically and log in using the email associated with it. + +3. Leave the `password` field blank. + +[iam-guide]: https://cloud.google.com/sql/docs/postgres/iam-logins +[cloudsql-users]: https://cloud.google.com/sql/docs/postgres/create-manage-users + +## Example + +```yaml +kind: sources +name: my-cloud-sql-pg-source +type: cloud-sql-postgres +project: my-project-id +region: us-central1 +instance: my-instance +database: my_db +user: ${USER_NAME} +password: ${PASSWORD} +# ipType: "private" +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +### Managed Connection Pooling + +Toolbox automatically supports [Managed Connection Pooling][csql-mcp]. If your Cloud SQL for PostgreSQL instance has Managed Connection Pooling enabled, the connection will immediately benefit from increased throughput and reduced latency. + +The interface is identical, so there's no additional configuration required on the client. For more information on configuring your instance, see the [Cloud SQL Managed Connection Pooling documentation][csql-mcp-docs]. + +[csql-mcp]: https://docs.cloud.google.com/sql/docs/postgres/managed-connection-pooling +[csql-mcp-docs]: https://docs.cloud.google.com/sql/docs/postgres/configure-mcp + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|--------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "cloud-sql-postgres". | +| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | +| region | string | true | Name of the GCP region that the cluster was created in (e.g. "us-central1"). | +| instance | string | true | Name of the Cloud SQL instance within the cluster (e.g. "my-instance"). | +| database | string | true | Name of the Postgres database to connect to (e.g. "my_db"). | +| user | string | false | Name of the Postgres user to connect as (e.g. "my-pg-user"). Defaults to IAM auth using [ADC][adc] email if unspecified. | +| password | string | false | Password of the Postgres user (e.g. "my-password"). Defaults to attempting IAM authentication if unspecified. | +| ipType | string | false | IP Type of the Cloud SQL instance; must be one of `public`, `private`, or `psc`. Default: `public`. | diff --git a/docs/en/integrations/cloud-sql-pg/tools/_index.md b/docs/en/integrations/cloud-sql-pg/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/cloud-sql-pg/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/cloud-sql-pg/tools/postgres-tools.md b/docs/en/integrations/cloud-sql-pg/tools/postgres-tools.md new file mode 100644 index 000000000000..d5041aacf9ef --- /dev/null +++ b/docs/en/integrations/cloud-sql-pg/tools/postgres-tools.md @@ -0,0 +1,8 @@ +--- +title: "PostgreSQL Tools" +weight: 90 +type: docs +is_wrapper: true +--- + +{{< list-tools dirs="integrations/postgres/tools" >}} \ No newline at end of file diff --git a/docs/en/integrations/cloudgda/_index.md b/docs/en/integrations/cloudgda/_index.md index a25d7a57ddec..61f287553599 100644 --- a/docs/en/integrations/cloudgda/_index.md +++ b/docs/en/integrations/cloudgda/_index.md @@ -1,44 +1,4 @@ --- -title: "Gemini Data Analytics Source" -type: docs +title: "Gemini Data Analytics" weight: 1 -description: > - A "cloud-gemini-data-analytics" source provides a client for the Gemini Data Analytics API. -no_list: true ---- - -## About - -The `cloud-gemini-data-analytics` source provides a client to interact with the [Gemini Data Analytics API](https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/rest). This allows tools to send natural language queries to the API. - -Authentication can be handled in two ways: - -1. **Application Default Credentials (ADC) (Recommended):** By default, the source uses ADC to authenticate with the API. The Toolbox server will fetch the credentials from its running environment (server-side authentication). This is the recommended method. -2. **Client-side OAuth:** If `useClientOAuth` is set to `true`, the source expects the authentication token to be provided by the caller when making a request to the Toolbox server (typically via an HTTP Bearer token). The Toolbox server will then forward this token to the underlying Gemini Data Analytics API calls. - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-gda-source -type: cloud-gemini-data-analytics -projectId: my-project-id ---- -kind: sources -name: my-oauth-gda-source -type: cloud-gemini-data-analytics -projectId: my-project-id -useClientOAuth: true -``` - -## Reference - -| **field** | **type** | **required** | **description** | -| -------------- | :------: | :----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| type | string | true | Must be "cloud-gemini-data-analytics". | -| projectId | string | true | The Google Cloud Project ID where the API is enabled. | -| useClientOAuth | boolean | false | If true, the source uses the token provided by the caller (forwarded to the API). Otherwise, it uses server-side Application Default Credentials (ADC). Defaults to `false`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/cloudgda/source.md b/docs/en/integrations/cloudgda/source.md new file mode 100644 index 000000000000..4cc68bb7a117 --- /dev/null +++ b/docs/en/integrations/cloudgda/source.md @@ -0,0 +1,45 @@ +--- +title: "Gemini Data Analytics Source" +type: docs +weight: 1 +linkTitle: "Source" +description: > + A "cloud-gemini-data-analytics" source provides a client for the Gemini Data Analytics API. +no_list: true +--- + +## About + +The `cloud-gemini-data-analytics` source provides a client to interact with the [Gemini Data Analytics API](https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/rest). This allows tools to send natural language queries to the API. + +Authentication can be handled in two ways: + +1. **Application Default Credentials (ADC) (Recommended):** By default, the source uses ADC to authenticate with the API. The Toolbox server will fetch the credentials from its running environment (server-side authentication). This is the recommended method. +2. **Client-side OAuth:** If `useClientOAuth` is set to `true`, the source expects the authentication token to be provided by the caller when making a request to the Toolbox server (typically via an HTTP Bearer token). The Toolbox server will then forward this token to the underlying Gemini Data Analytics API calls. + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-gda-source +type: cloud-gemini-data-analytics +projectId: my-project-id +--- +kind: sources +name: my-oauth-gda-source +type: cloud-gemini-data-analytics +projectId: my-project-id +useClientOAuth: true +``` + +## Reference + +| **field** | **type** | **required** | **description** | +| -------------- | :------: | :----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| type | string | true | Must be "cloud-gemini-data-analytics". | +| projectId | string | true | The Google Cloud Project ID where the API is enabled. | +| useClientOAuth | boolean | false | If true, the source uses the token provided by the caller (forwarded to the API). Otherwise, it uses server-side Application Default Credentials (ADC). Defaults to `false`. | diff --git a/docs/en/integrations/cloudgda/tools/_index.md b/docs/en/integrations/cloudgda/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/cloudgda/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/cloudgda/cloud-gda-query.md b/docs/en/integrations/cloudgda/tools/cloud-gda-query.md similarity index 99% rename from docs/en/integrations/cloudgda/cloud-gda-query.md rename to docs/en/integrations/cloudgda/tools/cloud-gda-query.md index 0a27bed2e8dc..7bd383cf5ac0 100644 --- a/docs/en/integrations/cloudgda/cloud-gda-query.md +++ b/docs/en/integrations/cloudgda/tools/cloud-gda-query.md @@ -1,5 +1,5 @@ --- -title: "cloud-gemini-data-analytics-query Tool" +title: "cloud-gemini-data-analytics-query" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/_index.md b/docs/en/integrations/cloudhealthcare/_index.md index 0e2dd1cf572d..ff3282c8ce62 100644 --- a/docs/en/integrations/cloudhealthcare/_index.md +++ b/docs/en/integrations/cloudhealthcare/_index.md @@ -1,124 +1,4 @@ --- -title: "Cloud Healthcare API Source" -linkTitle: "Cloud Healthcare" -type: docs +title: "Cloud Healthcare" weight: 1 -description: > - The Cloud Healthcare API provides a managed solution for storing and - accessing healthcare data in Google Cloud, providing a critical bridge - between existing care systems and applications hosted on Google Cloud. -no_list: true ---- - -## About - -The [Cloud Healthcare API][healthcare-docs] provides a managed solution -for storing and accessing healthcare data in Google Cloud, providing a -critical bridge between existing care systems and applications hosted on -Google Cloud. It supports healthcare data standards such as HL7® FHIR®, -HL7® v2, and DICOM®. It provides a fully managed, highly scalable, -enterprise-grade development environment for building clinical and analytics -solutions securely on Google Cloud. - -A dataset is a container in your Google Cloud project that holds modality-specific -healthcare data. Datasets contain other data stores, such as FHIR stores and DICOM -stores, which in turn hold their own types of healthcare data. - -A single dataset can contain one or many data stores, and those stores can all -service the same modality or different modalities as application needs dictate. -Using multiple stores in the same dataset might be appropriate in various -situations. - -If you are new to the Cloud Healthcare API, you can try to -[create and view datasets and stores using curl][healthcare-quickstart-curl]. - -[healthcare-docs]: https://cloud.google.com/healthcare/docs -[healthcare-quickstart-curl]: - https://cloud.google.com/healthcare-api/docs/store-healthcare-data-rest - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### IAM Permissions - -The Cloud Healthcare API uses [Identity and Access Management -(IAM)][iam-overview] to control user and group access to Cloud Healthcare -resources like projects, datasets, and stores. - -### Authentication via Application Default Credentials (ADC) - -By **default**, Toolbox will use your [Application Default Credentials -(ADC)][adc] to authorize and authenticate when interacting with the -[Cloud Healthcare API][healthcare-docs]. - -When using this method, you need to ensure the IAM identity associated with your -ADC (such as a service account) has the correct permissions for the queries you -intend to run. Common roles include `roles/healthcare.fhirResourceReader` (which -includes permissions to read and search for FHIR resources) or -`roles/healthcare.dicomViewer` (for retrieving DICOM images). -Follow this [guide][set-adc] to set up your ADC. - -### Authentication via User's OAuth Access Token - -If the `useClientOAuth` parameter is set to `true`, Toolbox will instead use the -OAuth access token for authentication. This token is parsed from the -`Authorization` header passed in with the tool invocation request. This method -allows Toolbox to make queries to the [Cloud Healthcare API][healthcare-docs] on -behalf of the client or the end-user. - -When using this on-behalf-of authentication, you must ensure that the -identity used has been granted the correct IAM permissions. - -[iam-overview]: -[adc]: -[set-adc]: - -## Example - -Initialize a Cloud Healthcare API source that uses ADC: - -```yaml -kind: sources -name: my-healthcare-source -type: "cloud-healthcare" -project: "my-project-id" -region: "us-central1" -dataset: "my-healthcare-dataset-id" -# allowedFhirStores: # Optional: Restricts tool access to a specific list of FHIR store IDs. -# - "my_fhir_store_1" -# allowedDicomStores: # Optional: Restricts tool access to a specific list of DICOM store IDs. -# - "my_dicom_store_1" -# - "my_dicom_store_2" -``` - -Initialize a Cloud Healthcare API source that uses the client's access token: - -```yaml -kind: sources -name: my-healthcare-client-auth-source -type: "cloud-healthcare" -project: "my-project-id" -region: "us-central1" -dataset: "my-healthcare-dataset-id" -useClientOAuth: true -# allowedFhirStores: # Optional: Restricts tool access to a specific list of FHIR store IDs. -# - "my_fhir_store_1" -# allowedDicomStores: # Optional: Restricts tool access to a specific list of DICOM store IDs. -# - "my_dicom_store_1" -# - "my_dicom_store_2" -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|--------------------|:--------:|:------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "cloud-healthcare". | -| project | string | true | ID of the GCP project that the dataset lives in. | -| region | string | true | Specifies the region (e.g., 'us', 'asia-northeast1') of the healthcare dataset. [Learn More](https://cloud.google.com/healthcare-api/docs/regions) | -| dataset | string | true | ID of the healthcare dataset. | -| allowedFhirStores | []string | false | An optional list of FHIR store IDs that tools using this source are allowed to access. If provided, any tool operation attempting to access a store not in this list will be rejected. If a single store is provided, it will be treated as the default for prebuilt tools. | -| allowedDicomStores | []string | false | An optional list of DICOM store IDs that tools using this source are allowed to access. If provided, any tool operation attempting to access a store not in this list will be rejected. If a single store is provided, it will be treated as the default for prebuilt tools. | -| useClientOAuth | bool | false | If true, forwards the client's OAuth access token from the "Authorization" header to downstream queries. | +--- \ No newline at end of file diff --git a/docs/en/integrations/cloudhealthcare/source.md b/docs/en/integrations/cloudhealthcare/source.md new file mode 100644 index 000000000000..38d80bbb05c2 --- /dev/null +++ b/docs/en/integrations/cloudhealthcare/source.md @@ -0,0 +1,124 @@ +--- +title: "Cloud Healthcare API Source" +type: docs +linkTitle: "Source" +weight: 1 +description: > + The Cloud Healthcare API provides a managed solution for storing and + accessing healthcare data in Google Cloud, providing a critical bridge + between existing care systems and applications hosted on Google Cloud. +no_list: true +--- + +## About + +The [Cloud Healthcare API][healthcare-docs] provides a managed solution +for storing and accessing healthcare data in Google Cloud, providing a +critical bridge between existing care systems and applications hosted on +Google Cloud. It supports healthcare data standards such as HL7® FHIR®, +HL7® v2, and DICOM®. It provides a fully managed, highly scalable, +enterprise-grade development environment for building clinical and analytics +solutions securely on Google Cloud. + +A dataset is a container in your Google Cloud project that holds modality-specific +healthcare data. Datasets contain other data stores, such as FHIR stores and DICOM +stores, which in turn hold their own types of healthcare data. + +A single dataset can contain one or many data stores, and those stores can all +service the same modality or different modalities as application needs dictate. +Using multiple stores in the same dataset might be appropriate in various +situations. + +If you are new to the Cloud Healthcare API, you can try to +[create and view datasets and stores using curl][healthcare-quickstart-curl]. + +[healthcare-docs]: https://cloud.google.com/healthcare/docs +[healthcare-quickstart-curl]: + https://cloud.google.com/healthcare-api/docs/store-healthcare-data-rest + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### IAM Permissions + +The Cloud Healthcare API uses [Identity and Access Management +(IAM)][iam-overview] to control user and group access to Cloud Healthcare +resources like projects, datasets, and stores. + +### Authentication via Application Default Credentials (ADC) + +By **default**, Toolbox will use your [Application Default Credentials +(ADC)][adc] to authorize and authenticate when interacting with the +[Cloud Healthcare API][healthcare-docs]. + +When using this method, you need to ensure the IAM identity associated with your +ADC (such as a service account) has the correct permissions for the queries you +intend to run. Common roles include `roles/healthcare.fhirResourceReader` (which +includes permissions to read and search for FHIR resources) or +`roles/healthcare.dicomViewer` (for retrieving DICOM images). +Follow this [guide][set-adc] to set up your ADC. + +### Authentication via User's OAuth Access Token + +If the `useClientOAuth` parameter is set to `true`, Toolbox will instead use the +OAuth access token for authentication. This token is parsed from the +`Authorization` header passed in with the tool invocation request. This method +allows Toolbox to make queries to the [Cloud Healthcare API][healthcare-docs] on +behalf of the client or the end-user. + +When using this on-behalf-of authentication, you must ensure that the +identity used has been granted the correct IAM permissions. + +[iam-overview]: +[adc]: +[set-adc]: + +## Example + +Initialize a Cloud Healthcare API source that uses ADC: + +```yaml +kind: sources +name: my-healthcare-source +type: "cloud-healthcare" +project: "my-project-id" +region: "us-central1" +dataset: "my-healthcare-dataset-id" +# allowedFhirStores: # Optional: Restricts tool access to a specific list of FHIR store IDs. +# - "my_fhir_store_1" +# allowedDicomStores: # Optional: Restricts tool access to a specific list of DICOM store IDs. +# - "my_dicom_store_1" +# - "my_dicom_store_2" +``` + +Initialize a Cloud Healthcare API source that uses the client's access token: + +```yaml +kind: sources +name: my-healthcare-client-auth-source +type: "cloud-healthcare" +project: "my-project-id" +region: "us-central1" +dataset: "my-healthcare-dataset-id" +useClientOAuth: true +# allowedFhirStores: # Optional: Restricts tool access to a specific list of FHIR store IDs. +# - "my_fhir_store_1" +# allowedDicomStores: # Optional: Restricts tool access to a specific list of DICOM store IDs. +# - "my_dicom_store_1" +# - "my_dicom_store_2" +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|--------------------|:--------:|:------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "cloud-healthcare". | +| project | string | true | ID of the GCP project that the dataset lives in. | +| region | string | true | Specifies the region (e.g., 'us', 'asia-northeast1') of the healthcare dataset. [Learn More](https://cloud.google.com/healthcare-api/docs/regions) | +| dataset | string | true | ID of the healthcare dataset. | +| allowedFhirStores | []string | false | An optional list of FHIR store IDs that tools using this source are allowed to access. If provided, any tool operation attempting to access a store not in this list will be rejected. If a single store is provided, it will be treated as the default for prebuilt tools. | +| allowedDicomStores | []string | false | An optional list of DICOM store IDs that tools using this source are allowed to access. If provided, any tool operation attempting to access a store not in this list will be rejected. If a single store is provided, it will be treated as the default for prebuilt tools. | +| useClientOAuth | bool | false | If true, forwards the client's OAuth access token from the "Authorization" header to downstream queries. | diff --git a/docs/en/integrations/cloudhealthcare/tools/_index.md b/docs/en/integrations/cloudhealthcare/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/cloudhealthcare/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-fhir-fetch-page.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-fhir-fetch-page.md similarity index 97% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-fhir-fetch-page.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-fhir-fetch-page.md index d4e187503c6b..9054a847f4e0 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-fhir-fetch-page.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-fhir-fetch-page.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-fhir-fetch-page Tool" +title: "cloud-healthcare-fhir-fetch-page" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-fhir-patient-everything.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-fhir-patient-everything.md similarity index 98% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-fhir-patient-everything.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-fhir-patient-everything.md index 76163d6158a4..749c5188c61e 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-fhir-patient-everything.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-fhir-patient-everything.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-fhir-patient-everything Tool" +title: "cloud-healthcare-fhir-patient-everything" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-fhir-patient-search.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-fhir-patient-search.md similarity index 98% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-fhir-patient-search.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-fhir-patient-search.md index 66f306e78c2a..309e6df472ba 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-fhir-patient-search.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-fhir-patient-search.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-fhir-patient-search Tool" +title: "cloud-healthcare-fhir-patient-search" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-dataset.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-dataset.md similarity index 96% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-get-dataset.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-dataset.md index d7913d45a963..fa1698b8b6ee 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-dataset.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-dataset.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-get-dataset Tool" +title: "cloud-healthcare-get-dataset" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-dicom-store-metrics.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-dicom-store-metrics.md similarity index 96% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-get-dicom-store-metrics.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-dicom-store-metrics.md index 82545969bd30..f7c6a4968cb2 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-dicom-store-metrics.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-dicom-store-metrics.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-get-dicom-store-metrics Tool" +title: "cloud-healthcare-get-dicom-store-metrics" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-dicom-store.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-dicom-store.md similarity index 96% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-get-dicom-store.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-dicom-store.md index b75044e047cb..5477394fddbf 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-dicom-store.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-dicom-store.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-get-dicom-store Tool" +title: "cloud-healthcare-get-dicom-store" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-fhir-resource.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-fhir-resource.md similarity index 97% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-get-fhir-resource.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-fhir-resource.md index f1d250827de5..ef1f0f29b5e2 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-fhir-resource.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-fhir-resource.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-get-fhir-resource Tool" +title: "cloud-healthcare-get-fhir-resource" linkTitle: "cloud-healthcare-get-fhir-resource" type: docs weight: 1 diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-fhir-store-metrics.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-fhir-store-metrics.md similarity index 96% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-get-fhir-store-metrics.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-fhir-store-metrics.md index fc1a4d028e11..9a017a6ce6e8 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-fhir-store-metrics.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-fhir-store-metrics.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-get-fhir-store-metrics Tool" +title: "cloud-healthcare-get-fhir-store-metrics" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-fhir-store.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-fhir-store.md similarity index 96% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-get-fhir-store.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-fhir-store.md index b1841ac08049..aa09f615ea8a 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-get-fhir-store.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-get-fhir-store.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-get-fhir-store Tool" +title: "cloud-healthcare-get-fhir-store" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-list-dicom-stores.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-list-dicom-stores.md similarity index 95% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-list-dicom-stores.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-list-dicom-stores.md index e13ff7503168..617ec4e73145 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-list-dicom-stores.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-list-dicom-stores.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-list-dicom-stores Tool" +title: "cloud-healthcare-list-dicom-stores" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-list-fhir-stores.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-list-fhir-stores.md similarity index 96% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-list-fhir-stores.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-list-fhir-stores.md index 6088a8d7b8e0..b39530f5102d 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-list-fhir-stores.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-list-fhir-stores.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-list-fhir-stores Tool" +title: "cloud-healthcare-list-fhir-stores" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-retrieve-rendered-dicom-instance.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-retrieve-rendered-dicom-instance.md similarity index 97% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-retrieve-rendered-dicom-instance.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-retrieve-rendered-dicom-instance.md index 54b628b9cc84..01014d7a82cf 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-retrieve-rendered-dicom-instance.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-retrieve-rendered-dicom-instance.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-retrieve-rendered-dicom-instance Tool" +title: "cloud-healthcare-retrieve-rendered-dicom-instance" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-search-dicom-instances.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-search-dicom-instances.md similarity index 99% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-search-dicom-instances.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-search-dicom-instances.md index 4529d9a69cf3..86443e535917 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-search-dicom-instances.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-search-dicom-instances.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-search-dicom-instances Tool" +title: "cloud-healthcare-search-dicom-instances" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-search-dicom-series.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-search-dicom-series.md similarity index 99% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-search-dicom-series.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-search-dicom-series.md index 3c145325272f..363c9fd455be 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-search-dicom-series.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-search-dicom-series.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-search-dicom-series Tool" +title: "cloud-healthcare-search-dicom-series" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudhealthcare/cloud-healthcare-search-dicom-studies.md b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-search-dicom-studies.md similarity index 99% rename from docs/en/integrations/cloudhealthcare/cloud-healthcare-search-dicom-studies.md rename to docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-search-dicom-studies.md index 85a96d5c9bfc..5b415a292ac6 100644 --- a/docs/en/integrations/cloudhealthcare/cloud-healthcare-search-dicom-studies.md +++ b/docs/en/integrations/cloudhealthcare/tools/cloud-healthcare-search-dicom-studies.md @@ -1,5 +1,5 @@ --- -title: "cloud-healthcare-search-dicom-studies Tool" +title: "cloud-healthcare-search-dicom-studies" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cloudloggingadmin/_index.md b/docs/en/integrations/cloudloggingadmin/_index.md index f3b0e36e120e..1fe87e75f779 100644 --- a/docs/en/integrations/cloudloggingadmin/_index.md +++ b/docs/en/integrations/cloudloggingadmin/_index.md @@ -1,65 +1,4 @@ --- -title: "Cloud Logging Admin Source" -type: docs +title: "Cloud Logging Admin" weight: 1 -description: > - The Cloud Logging Admin source enables tools to interact with the Cloud Logging API, allowing for the retrieval of log names, monitored resource types, and the querying of log data. -no_list: true ---- - -## About - -The Cloud Logging Admin source provides a client to interact with the [Google -Cloud Logging API](https://cloud.google.com/logging/docs). This allows tools to list log names, monitored resource types, and query log entries. - -Authentication can be handled in two ways: - -1. **Application Default Credentials (ADC):** By default, the source uses ADC - to authenticate with the API. -2. **Client-side OAuth:** If `useClientOAuth` is set to `true`, the source will - expect an OAuth 2.0 access token to be provided by the client (e.g., a web - browser) for each request. - -## Available Tools - -{{< list-tools >}} - -## Example - -Initialize a Cloud Logging Admin source that uses ADC: - -```yaml -kind: sources -name: my-cloud-logging -type: cloud-logging-admin -project: my-project-id -``` - -Initialize a Cloud Logging Admin source that uses client-side OAuth: - -```yaml -kind: sources -name: my-oauth-cloud-logging -type: cloud-logging-admin -project: my-project-id -useClientOAuth: true -``` - -Initialize a Cloud Logging Admin source that uses service account impersonation: - -```yaml -kind: sources -name: my-impersonated-cloud-logging -type: cloud-logging-admin -project: my-project-id -impersonateServiceAccount: "my-service-account@my-project.iam.gserviceaccount.com" -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------------------------|:--------:|:------------:|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "cloud-logging-admin". | -| project | string | true | ID of the GCP project. | -| useClientOAuth | boolean | false | If true, the source will use client-side OAuth for authorization. Otherwise, it will use Application Default Credentials. Defaults to `false`. Cannot be used with `impersonateServiceAccount`. | -| impersonateServiceAccount | string | false | The service account to impersonate for API calls. Cannot be used with `useClientOAuth`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/cloudloggingadmin/source.md b/docs/en/integrations/cloudloggingadmin/source.md new file mode 100644 index 000000000000..4849c82e97bd --- /dev/null +++ b/docs/en/integrations/cloudloggingadmin/source.md @@ -0,0 +1,66 @@ +--- +title: "Cloud Logging Admin Source" +type: docs +linkTitle: "Source" +weight: 1 +description: > + The Cloud Logging Admin source enables tools to interact with the Cloud Logging API, allowing for the retrieval of log names, monitored resource types, and the querying of log data. +no_list: true +--- + +## About + +The Cloud Logging Admin source provides a client to interact with the [Google +Cloud Logging API](https://cloud.google.com/logging/docs). This allows tools to list log names, monitored resource types, and query log entries. + +Authentication can be handled in two ways: + +1. **Application Default Credentials (ADC):** By default, the source uses ADC + to authenticate with the API. +2. **Client-side OAuth:** If `useClientOAuth` is set to `true`, the source will + expect an OAuth 2.0 access token to be provided by the client (e.g., a web + browser) for each request. + +## Available Tools + +{{< list-tools >}} + +## Example + +Initialize a Cloud Logging Admin source that uses ADC: + +```yaml +kind: sources +name: my-cloud-logging +type: cloud-logging-admin +project: my-project-id +``` + +Initialize a Cloud Logging Admin source that uses client-side OAuth: + +```yaml +kind: sources +name: my-oauth-cloud-logging +type: cloud-logging-admin +project: my-project-id +useClientOAuth: true +``` + +Initialize a Cloud Logging Admin source that uses service account impersonation: + +```yaml +kind: sources +name: my-impersonated-cloud-logging +type: cloud-logging-admin +project: my-project-id +impersonateServiceAccount: "my-service-account@my-project.iam.gserviceaccount.com" +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------------------------|:--------:|:------------:|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "cloud-logging-admin". | +| project | string | true | ID of the GCP project. | +| useClientOAuth | boolean | false | If true, the source will use client-side OAuth for authorization. Otherwise, it will use Application Default Credentials. Defaults to `false`. Cannot be used with `impersonateServiceAccount`. | +| impersonateServiceAccount | string | false | The service account to impersonate for API calls. Cannot be used with `useClientOAuth`. | diff --git a/docs/en/integrations/cloudloggingadmin/cloud-logging-admin-list-log-names.md b/docs/en/integrations/cloudloggingadmin/tools/cloud-logging-admin-list-log-names.md similarity index 95% rename from docs/en/integrations/cloudloggingadmin/cloud-logging-admin-list-log-names.md rename to docs/en/integrations/cloudloggingadmin/tools/cloud-logging-admin-list-log-names.md index 20a58a0c269a..951f7ce755bb 100644 --- a/docs/en/integrations/cloudloggingadmin/cloud-logging-admin-list-log-names.md +++ b/docs/en/integrations/cloudloggingadmin/tools/cloud-logging-admin-list-log-names.md @@ -1,5 +1,5 @@ --- -title: "cloud-logging-admin-list-log-names Tool" +title: "cloud-logging-admin-list-log-names" type: docs description: > A "cloud-logging-admin-list-log-names" tool lists the log names in the project. diff --git a/docs/en/integrations/cloudloggingadmin/cloud-logging-admin-list-resource-types.md b/docs/en/integrations/cloudloggingadmin/tools/cloud-logging-admin-list-resource-types.md similarity index 94% rename from docs/en/integrations/cloudloggingadmin/cloud-logging-admin-list-resource-types.md rename to docs/en/integrations/cloudloggingadmin/tools/cloud-logging-admin-list-resource-types.md index 1a5d1faddcae..e62f4f922dc8 100644 --- a/docs/en/integrations/cloudloggingadmin/cloud-logging-admin-list-resource-types.md +++ b/docs/en/integrations/cloudloggingadmin/tools/cloud-logging-admin-list-resource-types.md @@ -1,5 +1,5 @@ --- -title: "cloud-logging-admin-list-resource-types Tool" +title: "cloud-logging-admin-list-resource-types" type: docs description: > A "cloud-logging-admin-list-resource-types" tool lists the monitored resource types. diff --git a/docs/en/integrations/cloudloggingadmin/cloud-logging-admin-query-logs.md b/docs/en/integrations/cloudloggingadmin/tools/cloud-logging-admin-query-logs.md similarity index 97% rename from docs/en/integrations/cloudloggingadmin/cloud-logging-admin-query-logs.md rename to docs/en/integrations/cloudloggingadmin/tools/cloud-logging-admin-query-logs.md index 60cb81b8f5d5..f7f967fa6923 100644 --- a/docs/en/integrations/cloudloggingadmin/cloud-logging-admin-query-logs.md +++ b/docs/en/integrations/cloudloggingadmin/tools/cloud-logging-admin-query-logs.md @@ -1,5 +1,5 @@ --- -title: "cloud-logging-admin-query-logs Tool" +title: "cloud-logging-admin-query-logs" type: docs description: > A "cloud-logging-admin-query-logs" tool queries log entries. diff --git a/docs/en/integrations/cloudmonitoring/_index.md b/docs/en/integrations/cloudmonitoring/_index.md index df17570c062b..a609a7e60fb0 100644 --- a/docs/en/integrations/cloudmonitoring/_index.md +++ b/docs/en/integrations/cloudmonitoring/_index.md @@ -1,46 +1,4 @@ --- -title: "Cloud Monitoring Source" -type: docs +title: "Cloud Monitoring" weight: 1 -description: > - A "cloud-monitoring" source provides a client for the Cloud Monitoring API. -no_list: true ---- - -## About - -The `cloud-monitoring` source provides a client to interact with the [Google -Cloud Monitoring API](https://cloud.google.com/monitoring/api). This allows -tools to access cloud monitoring metrics explorer and run promql queries. - -Authentication can be handled in two ways: - -1. **Application Default Credentials (ADC):** By default, the source uses ADC - to authenticate with the API. -2. **Client-side OAuth:** If `useClientOAuth` is set to `true`, the source will - expect an OAuth 2.0 access token to be provided by the client (e.g., a web - browser) for each request. - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-cloud-monitoring -type: cloud-monitoring ---- -kind: sources -name: my-oauth-cloud-monitoring -type: cloud-monitoring -useClientOAuth: true -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|----------------|:--------:|:------------:|------------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "cloud-monitoring". | -| useClientOAuth | boolean | false | If true, the source will use client-side OAuth for authorization. Otherwise, it will use Application Default Credentials. Defaults to `false`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/cloudmonitoring/source.md b/docs/en/integrations/cloudmonitoring/source.md new file mode 100644 index 000000000000..5790d60f3963 --- /dev/null +++ b/docs/en/integrations/cloudmonitoring/source.md @@ -0,0 +1,47 @@ +--- +title: "Cloud Monitoring Source" +type: docs +linkTitle: "Source" +weight: 1 +description: > + A "cloud-monitoring" source provides a client for the Cloud Monitoring API. +no_list: true +--- + +## About + +The `cloud-monitoring` source provides a client to interact with the [Google +Cloud Monitoring API](https://cloud.google.com/monitoring/api). This allows +tools to access cloud monitoring metrics explorer and run promql queries. + +Authentication can be handled in two ways: + +1. **Application Default Credentials (ADC):** By default, the source uses ADC + to authenticate with the API. +2. **Client-side OAuth:** If `useClientOAuth` is set to `true`, the source will + expect an OAuth 2.0 access token to be provided by the client (e.g., a web + browser) for each request. + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-cloud-monitoring +type: cloud-monitoring +--- +kind: sources +name: my-oauth-cloud-monitoring +type: cloud-monitoring +useClientOAuth: true +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|----------------|:--------:|:------------:|------------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "cloud-monitoring". | +| useClientOAuth | boolean | false | If true, the source will use client-side OAuth for authorization. Otherwise, it will use Application Default Credentials. Defaults to `false`. | diff --git a/docs/en/integrations/cloudmonitoring/tools/_index.md b/docs/en/integrations/cloudmonitoring/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/cloudmonitoring/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/cloudmonitoring/cloud-monitoring-query-prometheus.md b/docs/en/integrations/cloudmonitoring/tools/cloud-monitoring-query-prometheus.md similarity index 91% rename from docs/en/integrations/cloudmonitoring/cloud-monitoring-query-prometheus.md rename to docs/en/integrations/cloudmonitoring/tools/cloud-monitoring-query-prometheus.md index 40d48055d89a..ca44f9ed876f 100644 --- a/docs/en/integrations/cloudmonitoring/cloud-monitoring-query-prometheus.md +++ b/docs/en/integrations/cloudmonitoring/tools/cloud-monitoring-query-prometheus.md @@ -1,5 +1,5 @@ --- -title: cloud-monitoring-query-prometheus Tool +title: cloud-monitoring-query-prometheus type: docs weight: 1 description: The "cloud-monitoring-query-prometheus" tool fetches time series metrics for a project using a given prometheus query. @@ -25,12 +25,12 @@ Here are some common use cases for the `cloud-monitoring-query-prometheus` tool: - **Monitoring resource utilization:** Track CPU, memory, and disk usage for your database instance (Can use the [prebuilt - tools](../../user-guide/configuration/prebuilt-configs/_index.md)). + tools](../../../documentation/configuration/prebuilt-configs/_index.md)). - **Monitoring query performance:** Monitor latency, execution_time, wait_time for database instance or even for the queries running (Can use the [prebuilt - tools](../../user-guide/configuration/prebuilt-configs/_index.md)). + tools](../../../documentation/configuration/prebuilt-configs/_index.md)). - **System Health:** Get the overall system health for the database instance - (Can use the [prebuilt tools](../../user-guide/configuration/prebuilt-configs/_index.md)). + (Can use the [prebuilt tools](../../../documentation/configuration/prebuilt-configs/_index.md)). ## Compatible Sources diff --git a/docs/en/integrations/cockroachdb/_index.md b/docs/en/integrations/cockroachdb/_index.md index 841c8cd31220..264b0322d5b1 100644 --- a/docs/en/integrations/cockroachdb/_index.md +++ b/docs/en/integrations/cockroachdb/_index.md @@ -1,233 +1,4 @@ --- -title: "CockroachDB Source" -type: docs +title: "CockroachDB" weight: 1 -description: > - CockroachDB is a distributed SQL database built for cloud applications. -no_list: true --- - -## About - -[CockroachDB][crdb-docs] is a distributed SQL database designed for cloud-native applications. It provides strong consistency, horizontal scalability, and built-in resilience with automatic failover and recovery. CockroachDB uses the PostgreSQL wire protocol, making it compatible with many PostgreSQL tools and drivers while providing unique features like multi-region deployments and distributed transactions. - -**Minimum Version:** CockroachDB v25.1 or later is recommended for full tool compatibility. - -[crdb-docs]: https://www.cockroachlabs.com/docs/ - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source uses standard authentication. You will need to [create a CockroachDB user][crdb-users] to login to the database with. For CockroachDB Cloud deployments, SSL/TLS is required. - -[crdb-users]: https://www.cockroachlabs.com/docs/stable/create-user.html - -### SSL/TLS Configuration - -CockroachDB Cloud clusters require SSL/TLS connections. Use the `queryParams` section to configure SSL settings: - -- **For CockroachDB Cloud**: Use `sslmode: require` at minimum -- **For self-hosted with certificates**: Use `sslmode: verify-full` with certificate paths -- **For local development only**: Use `sslmode: disable` (not recommended for production) - -## Example - -```yaml -sources: - my_cockroachdb: - type: cockroachdb - host: your-cluster.cockroachlabs.cloud - port: "26257" - user: myuser - password: mypassword - database: defaultdb - maxRetries: 5 - retryBaseDelay: 500ms - queryParams: - sslmode: require - application_name: my-app - - # MCP Security Settings (recommended for production) - readOnlyMode: true # Read-only by default (MCP best practice) - enableWriteMode: false # Set to true to allow write operations - maxRowLimit: 1000 # Limit query results - queryTimeoutSec: 30 # Prevent long-running queries - enableTelemetry: true # Enable observability - telemetryVerbose: false # Set true for detailed logs - clusterID: "my-cluster" # Optional identifier - -tools: - list_expenses: - type: cockroachdb-sql - source: my_cockroachdb - description: List all expenses - statement: SELECT id, description, amount, category FROM expenses WHERE user_id = $1 - parameters: - - name: user_id - type: string - description: The user's ID - - describe_expenses: - type: cockroachdb-describe-table - source: my_cockroachdb - description: Describe the expenses table schema - - list_expenses_indexes: - type: cockroachdb-list-indexes - source: my_cockroachdb - description: List indexes on the expenses table -``` - -## Reference - -### Required Parameters - -| Parameter | Type | Description | -|-----------|------|-------------| -| `type` | string | Must be `cockroachdb` | -| `host` | string | The hostname or IP address of the CockroachDB cluster | -| `port` | string | The port number (typically "26257") | -| `user` | string | The database user name | -| `database` | string | The database name to connect to | - -### Optional Parameters - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `password` | string | "" | The database password (can be empty for certificate-based auth) | -| `maxRetries` | integer | 5 | Maximum number of connection retry attempts | -| `retryBaseDelay` | string | "500ms" | Base delay between retry attempts (exponential backoff) | -| `queryParams` | map | {} | Additional connection parameters (e.g., SSL configuration) | - -### MCP Security Parameters - -CockroachDB integration includes security features following the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) specification: - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `readOnlyMode` | boolean | true | Enables read-only mode by default (MCP requirement) | -| `enableWriteMode` | boolean | false | Explicitly enable write operations (INSERT/UPDATE/DELETE/CREATE/DROP) | -| `maxRowLimit` | integer | 1000 | Maximum rows returned per SELECT query (auto-adds LIMIT clause) | -| `queryTimeoutSec` | integer | 30 | Query timeout in seconds to prevent long-running queries | -| `enableTelemetry` | boolean | true | Enable structured logging of tool invocations | -| `telemetryVerbose` | boolean | false | Enable detailed JSON telemetry output | -| `clusterID` | string | "" | Optional cluster identifier for telemetry | - -### Query Parameters - -Common query parameters for CockroachDB connections: - -| Parameter | Values | Description | -|-----------|--------|-------------| -| `sslmode` | `disable`, `require`, `verify-ca`, `verify-full` | SSL/TLS mode (CockroachDB Cloud requires `require` or higher) | -| `sslrootcert` | file path | Path to root certificate for SSL verification | -| `sslcert` | file path | Path to client certificate | -| `sslkey` | file path | Path to client key | -| `application_name` | string | Application name for connection tracking | - -## Advanced Usage - -### Security and MCP Compliance - -**Read-Only by Default**: The integration follows MCP best practices by defaulting to read-only mode. This prevents accidental data modifications: - -```yaml -sources: - my_cockroachdb: - readOnlyMode: true # Default behavior - enableWriteMode: false # Explicit write opt-in required -``` - -To enable write operations: - -```yaml -sources: - my_cockroachdb: - readOnlyMode: false # Disable read-only protection - enableWriteMode: true # Explicitly allow writes -``` - -**Query Limits**: Automatic row limits prevent excessive data retrieval: -- SELECT queries automatically get `LIMIT 1000` appended (configurable via `maxRowLimit`) -- Queries are terminated after 30 seconds (configurable via `queryTimeoutSec`) - -**Observability**: Structured telemetry provides visibility into tool usage: -- Tool invocations are logged with status, latency, and row counts -- SQL queries are redacted to protect sensitive values -- Set `telemetryVerbose: true` for detailed JSON logs - -### Use UUID Primary Keys - -CockroachDB performs best with UUID primary keys rather than sequential integers to avoid transaction hotspots: - -```sql -CREATE TABLE expenses ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - description TEXT, - amount DECIMAL(10,2) -); -``` - -### Automatic Transaction Retry - -This source uses the official `cockroach-go/v2` library which provides automatic transaction retry for serialization conflicts. For write operations requiring explicit transaction control, tools can use the `ExecuteTxWithRetry` method. - -### Multi-Region Deployments - -CockroachDB supports multi-region deployments with automatic data distribution. Configure your cluster's regions and survival goals separately from the Toolbox configuration. The source will connect to any node in the cluster. - -### Connection Pooling - -The source maintains a connection pool to the CockroachDB cluster. The pool automatically handles: -- Load balancing across cluster nodes -- Connection retry with exponential backoff -- Health checking of connections - -## Troubleshooting - -### SSL/TLS Errors - -If you encounter "server requires encryption" errors: - -1. For CockroachDB Cloud, ensure `sslmode` is set to `require` or higher: - ```yaml - queryParams: - sslmode: require - ``` - -2. For certificate verification, download your cluster's root certificate and configure: - ```yaml - queryParams: - sslmode: verify-full - sslrootcert: /path/to/ca.crt - ``` - -### Connection Timeouts - -If experiencing connection timeouts: - -1. Check network connectivity to the CockroachDB cluster -2. Verify firewall rules allow connections on port 26257 -3. For CockroachDB Cloud, ensure IP allowlisting is configured -4. Increase `maxRetries` or `retryBaseDelay` if needed - -### Transaction Retry Errors - -CockroachDB may encounter serializable transaction conflicts. The integration automatically handles these retries using the cockroach-go library. If you see retry-related errors, check: - -1. Database load and contention -2. Query patterns that might cause conflicts -3. Consider using `SELECT FOR UPDATE` for explicit locking - -## Additional Resources - -- [CockroachDB Documentation](https://www.cockroachlabs.com/docs/) -- [CockroachDB Best Practices](https://www.cockroachlabs.com/docs/stable/performance-best-practices-overview.html) -- [Multi-Region Capabilities](https://www.cockroachlabs.com/docs/stable/multiregion-overview.html) -- [Connection Parameters](https://www.cockroachlabs.com/docs/stable/connection-parameters.html) diff --git a/docs/en/integrations/cockroachdb/source.md b/docs/en/integrations/cockroachdb/source.md new file mode 100644 index 000000000000..58512449344b --- /dev/null +++ b/docs/en/integrations/cockroachdb/source.md @@ -0,0 +1,232 @@ +--- +title: "CockroachDB" +weight: 1 +description: > + CockroachDB is a distributed SQL database built for cloud applications. +no_list: true +--- + +## About + +[CockroachDB][crdb-docs] is a distributed SQL database designed for cloud-native applications. It provides strong consistency, horizontal scalability, and built-in resilience with automatic failover and recovery. CockroachDB uses the PostgreSQL wire protocol, making it compatible with many PostgreSQL tools and drivers while providing unique features like multi-region deployments and distributed transactions. + +**Minimum Version:** CockroachDB v25.1 or later is recommended for full tool compatibility. + +[crdb-docs]: https://www.cockroachlabs.com/docs/ + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source uses standard authentication. You will need to [create a CockroachDB user][crdb-users] to login to the database with. For CockroachDB Cloud deployments, SSL/TLS is required. + +[crdb-users]: https://www.cockroachlabs.com/docs/stable/create-user.html + +### SSL/TLS Configuration + +CockroachDB Cloud clusters require SSL/TLS connections. Use the `queryParams` section to configure SSL settings: + +- **For CockroachDB Cloud**: Use `sslmode: require` at minimum +- **For self-hosted with certificates**: Use `sslmode: verify-full` with certificate paths +- **For local development only**: Use `sslmode: disable` (not recommended for production) + +## Example + +```yaml +sources: + my_cockroachdb: + type: cockroachdb + host: your-cluster.cockroachlabs.cloud + port: "26257" + user: myuser + password: mypassword + database: defaultdb + maxRetries: 5 + retryBaseDelay: 500ms + queryParams: + sslmode: require + application_name: my-app + + # MCP Security Settings (recommended for production) + readOnlyMode: true # Read-only by default (MCP best practice) + enableWriteMode: false # Set to true to allow write operations + maxRowLimit: 1000 # Limit query results + queryTimeoutSec: 30 # Prevent long-running queries + enableTelemetry: true # Enable observability + telemetryVerbose: false # Set true for detailed logs + clusterID: "my-cluster" # Optional identifier + +tools: + list_expenses: + type: cockroachdb-sql + source: my_cockroachdb + description: List all expenses + statement: SELECT id, description, amount, category FROM expenses WHERE user_id = $1 + parameters: + - name: user_id + type: string + description: The user's ID + + describe_expenses: + type: cockroachdb-describe-table + source: my_cockroachdb + description: Describe the expenses table schema + + list_expenses_indexes: + type: cockroachdb-list-indexes + source: my_cockroachdb + description: List indexes on the expenses table +``` + +## Reference + +### Required Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `type` | string | Must be `cockroachdb` | +| `host` | string | The hostname or IP address of the CockroachDB cluster | +| `port` | string | The port number (typically "26257") | +| `user` | string | The database user name | +| `database` | string | The database name to connect to | + +### Optional Parameters + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `password` | string | "" | The database password (can be empty for certificate-based auth) | +| `maxRetries` | integer | 5 | Maximum number of connection retry attempts | +| `retryBaseDelay` | string | "500ms" | Base delay between retry attempts (exponential backoff) | +| `queryParams` | map | {} | Additional connection parameters (e.g., SSL configuration) | + +### MCP Security Parameters + +CockroachDB integration includes security features following the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) specification: + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `readOnlyMode` | boolean | true | Enables read-only mode by default (MCP requirement) | +| `enableWriteMode` | boolean | false | Explicitly enable write operations (INSERT/UPDATE/DELETE/CREATE/DROP) | +| `maxRowLimit` | integer | 1000 | Maximum rows returned per SELECT query (auto-adds LIMIT clause) | +| `queryTimeoutSec` | integer | 30 | Query timeout in seconds to prevent long-running queries | +| `enableTelemetry` | boolean | true | Enable structured logging of tool invocations | +| `telemetryVerbose` | boolean | false | Enable detailed JSON telemetry output | +| `clusterID` | string | "" | Optional cluster identifier for telemetry | + +### Query Parameters + +Common query parameters for CockroachDB connections: + +| Parameter | Values | Description | +|-----------|--------|-------------| +| `sslmode` | `disable`, `require`, `verify-ca`, `verify-full` | SSL/TLS mode (CockroachDB Cloud requires `require` or higher) | +| `sslrootcert` | file path | Path to root certificate for SSL verification | +| `sslcert` | file path | Path to client certificate | +| `sslkey` | file path | Path to client key | +| `application_name` | string | Application name for connection tracking | + +## Advanced Usage + +### Security and MCP Compliance + +**Read-Only by Default**: The integration follows MCP best practices by defaulting to read-only mode. This prevents accidental data modifications: + +```yaml +sources: + my_cockroachdb: + readOnlyMode: true # Default behavior + enableWriteMode: false # Explicit write opt-in required +``` + +To enable write operations: + +```yaml +sources: + my_cockroachdb: + readOnlyMode: false # Disable read-only protection + enableWriteMode: true # Explicitly allow writes +``` + +**Query Limits**: Automatic row limits prevent excessive data retrieval: +- SELECT queries automatically get `LIMIT 1000` appended (configurable via `maxRowLimit`) +- Queries are terminated after 30 seconds (configurable via `queryTimeoutSec`) + +**Observability**: Structured telemetry provides visibility into tool usage: +- Tool invocations are logged with status, latency, and row counts +- SQL queries are redacted to protect sensitive values +- Set `telemetryVerbose: true` for detailed JSON logs + +### Use UUID Primary Keys + +CockroachDB performs best with UUID primary keys rather than sequential integers to avoid transaction hotspots: + +```sql +CREATE TABLE expenses ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + description TEXT, + amount DECIMAL(10,2) +); +``` + +### Automatic Transaction Retry + +This source uses the official `cockroach-go/v2` library which provides automatic transaction retry for serialization conflicts. For write operations requiring explicit transaction control, tools can use the `ExecuteTxWithRetry` method. + +### Multi-Region Deployments + +CockroachDB supports multi-region deployments with automatic data distribution. Configure your cluster's regions and survival goals separately from the Toolbox configuration. The source will connect to any node in the cluster. + +### Connection Pooling + +The source maintains a connection pool to the CockroachDB cluster. The pool automatically handles: +- Load balancing across cluster nodes +- Connection retry with exponential backoff +- Health checking of connections + +## Troubleshooting + +### SSL/TLS Errors + +If you encounter "server requires encryption" errors: + +1. For CockroachDB Cloud, ensure `sslmode` is set to `require` or higher: + ```yaml + queryParams: + sslmode: require + ``` + +2. For certificate verification, download your cluster's root certificate and configure: + ```yaml + queryParams: + sslmode: verify-full + sslrootcert: /path/to/ca.crt + ``` + +### Connection Timeouts + +If experiencing connection timeouts: + +1. Check network connectivity to the CockroachDB cluster +2. Verify firewall rules allow connections on port 26257 +3. For CockroachDB Cloud, ensure IP allowlisting is configured +4. Increase `maxRetries` or `retryBaseDelay` if needed + +### Transaction Retry Errors + +CockroachDB may encounter serializable transaction conflicts. The integration automatically handles these retries using the cockroach-go library. If you see retry-related errors, check: + +1. Database load and contention +2. Query patterns that might cause conflicts +3. Consider using `SELECT FOR UPDATE` for explicit locking + +## Additional Resources + +- [CockroachDB Documentation](https://www.cockroachlabs.com/docs/) +- [CockroachDB Best Practices](https://www.cockroachlabs.com/docs/stable/performance-best-practices-overview.html) +- [Multi-Region Capabilities](https://www.cockroachlabs.com/docs/stable/multiregion-overview.html) +- [Connection Parameters](https://www.cockroachlabs.com/docs/stable/connection-parameters.html) diff --git a/docs/en/integrations/cockroachdb/tools/_index.md b/docs/en/integrations/cockroachdb/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/cockroachdb/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/cockroachdb/cockroachdb-execute-sql.md b/docs/en/integrations/cockroachdb/tools/cockroachdb-execute-sql.md similarity index 99% rename from docs/en/integrations/cockroachdb/cockroachdb-execute-sql.md rename to docs/en/integrations/cockroachdb/tools/cockroachdb-execute-sql.md index 28ada4e61edb..2525c1939778 100644 --- a/docs/en/integrations/cockroachdb/cockroachdb-execute-sql.md +++ b/docs/en/integrations/cockroachdb/tools/cockroachdb-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "cockroachdb-execute-sql Tool" +title: "cockroachdb-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cockroachdb/cockroachdb-list-schemas.md b/docs/en/integrations/cockroachdb/tools/cockroachdb-list-schemas.md similarity index 99% rename from docs/en/integrations/cockroachdb/cockroachdb-list-schemas.md rename to docs/en/integrations/cockroachdb/tools/cockroachdb-list-schemas.md index 81bb6b73429d..ea578dba0a1e 100644 --- a/docs/en/integrations/cockroachdb/cockroachdb-list-schemas.md +++ b/docs/en/integrations/cockroachdb/tools/cockroachdb-list-schemas.md @@ -1,5 +1,5 @@ --- -title: "cockroachdb-list-schemas Tool" +title: "cockroachdb-list-schemas" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cockroachdb/cockroachdb-list-tables.md b/docs/en/integrations/cockroachdb/tools/cockroachdb-list-tables.md similarity index 99% rename from docs/en/integrations/cockroachdb/cockroachdb-list-tables.md rename to docs/en/integrations/cockroachdb/tools/cockroachdb-list-tables.md index 71886dc8e092..2f19d81991b8 100644 --- a/docs/en/integrations/cockroachdb/cockroachdb-list-tables.md +++ b/docs/en/integrations/cockroachdb/tools/cockroachdb-list-tables.md @@ -1,5 +1,5 @@ --- -title: "cockroachdb-list-tables Tool" +title: "cockroachdb-list-tables" type: docs weight: 1 description: > diff --git a/docs/en/integrations/cockroachdb/cockroachdb-sql.md b/docs/en/integrations/cockroachdb/tools/cockroachdb-sql.md similarity index 99% rename from docs/en/integrations/cockroachdb/cockroachdb-sql.md rename to docs/en/integrations/cockroachdb/tools/cockroachdb-sql.md index 1db180034e52..12f4bee70f2a 100644 --- a/docs/en/integrations/cockroachdb/cockroachdb-sql.md +++ b/docs/en/integrations/cockroachdb/tools/cockroachdb-sql.md @@ -1,5 +1,5 @@ --- -title: "cockroachdb-sql Tool" +title: "cockroachdb-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/couchbase/_index.md b/docs/en/integrations/couchbase/_index.md index 2e26113c5644..32bf897725cf 100644 --- a/docs/en/integrations/couchbase/_index.md +++ b/docs/en/integrations/couchbase/_index.md @@ -1,56 +1,4 @@ --- -title: "Couchbase Source" -type: docs +title: "Couchbase" weight: 1 -description: > - A "couchbase" source connects to a Couchbase database. -no_list: true ---- - -## About - -A `couchbase` source establishes a connection to a Couchbase database cluster, -allowing tools to execute SQL queries against it. - - - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-couchbase-instance -type: couchbase -connectionString: couchbase://localhost -bucket: travel-sample -scope: inventory -username: Administrator -password: password -``` - -{{< notice note >}} -For more details about alternate addresses and custom ports refer to [Managing -Connections](https://docs.couchbase.com/java-sdk/current/howtos/managing-connections.html). -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|----------------------|:--------:|:------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "couchbase". | -| connectionString | string | true | Connection string for the Couchbase cluster. | -| bucket | string | true | Name of the bucket to connect to. | -| scope | string | true | Name of the scope within the bucket. | -| username | string | false | Username for authentication. | -| password | string | false | Password for authentication. | -| clientCert | string | false | Path to client certificate file for TLS authentication. | -| clientCertPassword | string | false | Password for the client certificate. | -| clientKey | string | false | Path to client key file for TLS authentication. | -| clientKeyPassword | string | false | Password for the client key. | -| caCert | string | false | Path to CA certificate file. | -| noSslVerify | boolean | false | If true, skip server certificate verification. **Warning:** This option should only be used in development or testing environments. Disabling SSL verification poses significant security risks in production as it makes your connection vulnerable to man-in-the-middle attacks. | -| profile | string | false | Name of the connection profile to apply. | -| queryScanConsistency | integer | false | Query scan consistency. Controls the consistency guarantee for index scanning. Values: 1 for "not_bounded" (fastest option, but results may not include the most recent operations), 2 for "request_plus" (highest consistency level, includes all operations up until the query started, but incurs a performance penalty). If not specified, defaults to the Couchbase Go SDK default. | +--- \ No newline at end of file diff --git a/docs/en/integrations/couchbase/source.md b/docs/en/integrations/couchbase/source.md new file mode 100644 index 000000000000..c226e8268dde --- /dev/null +++ b/docs/en/integrations/couchbase/source.md @@ -0,0 +1,57 @@ +--- +title: "Couchbase Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + A "couchbase" source connects to a Couchbase database. +no_list: true +--- + +## About + +A `couchbase` source establishes a connection to a Couchbase database cluster, +allowing tools to execute SQL queries against it. + + + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-couchbase-instance +type: couchbase +connectionString: couchbase://localhost +bucket: travel-sample +scope: inventory +username: Administrator +password: password +``` + +{{< notice note >}} +For more details about alternate addresses and custom ports refer to [Managing +Connections](https://docs.couchbase.com/java-sdk/current/howtos/managing-connections.html). +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|----------------------|:--------:|:------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "couchbase". | +| connectionString | string | true | Connection string for the Couchbase cluster. | +| bucket | string | true | Name of the bucket to connect to. | +| scope | string | true | Name of the scope within the bucket. | +| username | string | false | Username for authentication. | +| password | string | false | Password for authentication. | +| clientCert | string | false | Path to client certificate file for TLS authentication. | +| clientCertPassword | string | false | Password for the client certificate. | +| clientKey | string | false | Path to client key file for TLS authentication. | +| clientKeyPassword | string | false | Password for the client key. | +| caCert | string | false | Path to CA certificate file. | +| noSslVerify | boolean | false | If true, skip server certificate verification. **Warning:** This option should only be used in development or testing environments. Disabling SSL verification poses significant security risks in production as it makes your connection vulnerable to man-in-the-middle attacks. | +| profile | string | false | Name of the connection profile to apply. | +| queryScanConsistency | integer | false | Query scan consistency. Controls the consistency guarantee for index scanning. Values: 1 for "not_bounded" (fastest option, but results may not include the most recent operations), 2 for "request_plus" (highest consistency level, includes all operations up until the query started, but incurs a performance penalty). If not specified, defaults to the Couchbase Go SDK default. | diff --git a/docs/en/integrations/couchbase/tools/_index.md b/docs/en/integrations/couchbase/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/couchbase/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/couchbase/couchbase-sql.md b/docs/en/integrations/couchbase/tools/couchbase-sql.md similarity index 99% rename from docs/en/integrations/couchbase/couchbase-sql.md rename to docs/en/integrations/couchbase/tools/couchbase-sql.md index 312c9d1b11c7..83019f9511c9 100644 --- a/docs/en/integrations/couchbase/couchbase-sql.md +++ b/docs/en/integrations/couchbase/tools/couchbase-sql.md @@ -1,5 +1,5 @@ --- -title: "couchbase-sql Tool" +title: "couchbase-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/dataform/_index.md b/docs/en/integrations/dataform/_index.md index 8001d134917b..f3608aadc4ce 100644 --- a/docs/en/integrations/dataform/_index.md +++ b/docs/en/integrations/dataform/_index.md @@ -2,6 +2,4 @@ title: "Dataform" type: docs weight: 1 -description: > - Tools that work with Dataform. --- \ No newline at end of file diff --git a/docs/en/integrations/dataform/tools/_index.md b/docs/en/integrations/dataform/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/dataform/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/dataform/dataform-compile-local.md b/docs/en/integrations/dataform/tools/dataform-compile-local.md similarity index 97% rename from docs/en/integrations/dataform/dataform-compile-local.md rename to docs/en/integrations/dataform/tools/dataform-compile-local.md index 5bb796da6455..8aa6f69785f6 100644 --- a/docs/en/integrations/dataform/dataform-compile-local.md +++ b/docs/en/integrations/dataform/tools/dataform-compile-local.md @@ -1,5 +1,5 @@ --- -title: "dataform-compile-local Tool" +title: "dataform-compile-local" type: docs weight: 1 description: > diff --git a/docs/en/integrations/dataplex/_index.md b/docs/en/integrations/dataplex/_index.md index b4c9706813bc..a239db7f7d46 100644 --- a/docs/en/integrations/dataplex/_index.md +++ b/docs/en/integrations/dataplex/_index.md @@ -1,367 +1,4 @@ --- -title: "Dataplex Source" -type: docs +title: "Dataplex" weight: 1 -description: > - Dataplex Universal Catalog is a unified, intelligent governance solution for data and AI assets in Google Cloud. Dataplex Universal Catalog powers AI, analytics, and business intelligence at scale. -no_list: true ---- - -## About - -[Dataplex][dataplex-docs] Universal Catalog is a unified, intelligent governance -solution for data and AI assets in Google Cloud. Dataplex Universal Catalog -powers AI, analytics, and business intelligence at scale. - -At the heart of these governance capabilities is a catalog that contains a -centralized inventory of the data assets in your organization. Dataplex -Universal Catalog holds business, technical, and runtime metadata for all of -your data. It helps you discover relationships and semantics in the metadata by -applying artificial intelligence and machine learning. - -[dataplex-docs]: https://cloud.google.com/dataplex/docs - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-dataplex-source -type: "dataplex" -project: "my-project-id" -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|----------------------------------------------------------------------------------| -| type | string | true | Must be "dataplex". | -| project | string | true | ID of the GCP project used for quota and billing purposes (e.g. "my-project-id").| - - -## Advanced Usage - -### Sample System Prompt - -You can use the following system prompt as "Custom Instructions" in your client -application. - -``` -# Objective -Your primary objective is to help discover, organize and manage metadata related to data assets. - -# Tone and Style -1. Adopt the persona of a senior subject matter expert -2. Your communication style must be: - 1. Concise: Always favor brevity. - 2. Direct: Avoid greetings (e.g., "Hi there!", "Certainly!"). Get straight to the point. - Example (Incorrect): Hi there! I see that you are looking for... - Example (Correct): This problem likely stems from... -3. Do not reiterate or summarize the question in the answer. -4. Crucially, always convey a tone of uncertainty and caution. Since you are interpreting metadata and have no way to externally verify your answers, never express complete confidence. Frame your responses as interpretations based solely on the provided metadata. Use a suggestive tone, not a prescriptive one: - Example (Correct): "The entry describes..." - Example (Correct): "According to catalog,..." - Example (Correct): "Based on the metadata,..." - Example (Correct): "Based on the search results,..." -5. Do not make assumptions - -# Data Model -## Entries -Entry represents a specific data asset. Entry acts as a metadata record for something that is managed by Catalog, such as: - -- A BigQuery table or dataset -- A Cloud Storage bucket or folder -- An on-premises SQL table - -## Aspects -While the Entry itself is a container, the rich descriptive information about the asset (e.g., schema, data types, business descriptions, classifications) is stored in associated components called Aspects. Aspects are created based on pre-defined blueprints known as Aspect Types. - -## Aspect Types -Aspect Type is a reusable template that defines the schema for a set of metadata fields. Think of an Aspect Type as a structure for the kind of metadata that is organized in the catalog within the Entry. - -Examples: -- projects/dataplex-types/locations/global/aspectTypes/analytics-hub-exchange -- projects/dataplex-types/locations/global/aspectTypes/analytics-hub -- projects/dataplex-types/locations/global/aspectTypes/analytics-hub-listing -- projects/dataplex-types/locations/global/aspectTypes/bigquery-connection -- projects/dataplex-types/locations/global/aspectTypes/bigquery-data-policy -- projects/dataplex-types/locations/global/aspectTypes/bigquery-dataset -- projects/dataplex-types/locations/global/aspectTypes/bigquery-model -- projects/dataplex-types/locations/global/aspectTypes/bigquery-policy -- projects/dataplex-types/locations/global/aspectTypes/bigquery-routine -- projects/dataplex-types/locations/global/aspectTypes/bigquery-row-access-policy -- projects/dataplex-types/locations/global/aspectTypes/bigquery-table -- projects/dataplex-types/locations/global/aspectTypes/bigquery-view -- projects/dataplex-types/locations/global/aspectTypes/cloud-bigtable-instance -- projects/dataplex-types/locations/global/aspectTypes/cloud-bigtable-table -- projects/dataplex-types/locations/global/aspectTypes/cloud-spanner-database -- projects/dataplex-types/locations/global/aspectTypes/cloud-spanner-instance -- projects/dataplex-types/locations/global/aspectTypes/cloud-spanner-table -- projects/dataplex-types/locations/global/aspectTypes/cloud-spanner-view -- projects/dataplex-types/locations/global/aspectTypes/cloudsql-database -- projects/dataplex-types/locations/global/aspectTypes/cloudsql-instance -- projects/dataplex-types/locations/global/aspectTypes/cloudsql-schema -- projects/dataplex-types/locations/global/aspectTypes/cloudsql-table -- projects/dataplex-types/locations/global/aspectTypes/cloudsql-view -- projects/dataplex-types/locations/global/aspectTypes/contacts -- projects/dataplex-types/locations/global/aspectTypes/dataform-code-asset -- projects/dataplex-types/locations/global/aspectTypes/dataform-repository -- projects/dataplex-types/locations/global/aspectTypes/dataform-workspace -- projects/dataplex-types/locations/global/aspectTypes/dataproc-metastore-database -- projects/dataplex-types/locations/global/aspectTypes/dataproc-metastore-service -- projects/dataplex-types/locations/global/aspectTypes/dataproc-metastore-table -- projects/dataplex-types/locations/global/aspectTypes/data-product -- projects/dataplex-types/locations/global/aspectTypes/data-quality-scorecard -- projects/dataplex-types/locations/global/aspectTypes/external-connection -- projects/dataplex-types/locations/global/aspectTypes/overview -- projects/dataplex-types/locations/global/aspectTypes/pubsub-topic -- projects/dataplex-types/locations/global/aspectTypes/schema -- projects/dataplex-types/locations/global/aspectTypes/sensitive-data-protection-job-result -- projects/dataplex-types/locations/global/aspectTypes/sensitive-data-protection-profile -- projects/dataplex-types/locations/global/aspectTypes/sql-access -- projects/dataplex-types/locations/global/aspectTypes/storage-bucket -- projects/dataplex-types/locations/global/aspectTypes/storage-folder -- projects/dataplex-types/locations/global/aspectTypes/storage -- projects/dataplex-types/locations/global/aspectTypes/usage - -## Entry Types -Every Entry must conform to an Entry Type. The Entry Type acts as a template, defining the structure, required aspects, and constraints for Entries of that type. - -Examples: -- projects/dataplex-types/locations/global/entryTypes/analytics-hub-exchange -- projects/dataplex-types/locations/global/entryTypes/analytics-hub-listing -- projects/dataplex-types/locations/global/entryTypes/bigquery-connection -- projects/dataplex-types/locations/global/entryTypes/bigquery-data-policy -- projects/dataplex-types/locations/global/entryTypes/bigquery-dataset -- projects/dataplex-types/locations/global/entryTypes/bigquery-model -- projects/dataplex-types/locations/global/entryTypes/bigquery-routine -- projects/dataplex-types/locations/global/entryTypes/bigquery-row-access-policy -- projects/dataplex-types/locations/global/entryTypes/bigquery-table -- projects/dataplex-types/locations/global/entryTypes/bigquery-view -- projects/dataplex-types/locations/global/entryTypes/cloud-bigtable-instance -- projects/dataplex-types/locations/global/entryTypes/cloud-bigtable-table -- projects/dataplex-types/locations/global/entryTypes/cloud-spanner-database -- projects/dataplex-types/locations/global/entryTypes/cloud-spanner-instance -- projects/dataplex-types/locations/global/entryTypes/cloud-spanner-table -- projects/dataplex-types/locations/global/entryTypes/cloud-spanner-view -- projects/dataplex-types/locations/global/entryTypes/cloudsql-mysql-database -- projects/dataplex-types/locations/global/entryTypes/cloudsql-mysql-instance -- projects/dataplex-types/locations/global/entryTypes/cloudsql-mysql-table -- projects/dataplex-types/locations/global/entryTypes/cloudsql-mysql-view -- projects/dataplex-types/locations/global/entryTypes/cloudsql-postgresql-database -- projects/dataplex-types/locations/global/entryTypes/cloudsql-postgresql-instance -- projects/dataplex-types/locations/global/entryTypes/cloudsql-postgresql-schema -- projects/dataplex-types/locations/global/entryTypes/cloudsql-postgresql-table -- projects/dataplex-types/locations/global/entryTypes/cloudsql-postgresql-view -- projects/dataplex-types/locations/global/entryTypes/cloudsql-sqlserver-database -- projects/dataplex-types/locations/global/entryTypes/cloudsql-sqlserver-instance -- projects/dataplex-types/locations/global/entryTypes/cloudsql-sqlserver-schema -- projects/dataplex-types/locations/global/entryTypes/cloudsql-sqlserver-table -- projects/dataplex-types/locations/global/entryTypes/cloudsql-sqlserver-view -- projects/dataplex-types/locations/global/entryTypes/dataform-code-asset -- projects/dataplex-types/locations/global/entryTypes/dataform-repository -- projects/dataplex-types/locations/global/entryTypes/dataform-workspace -- projects/dataplex-types/locations/global/entryTypes/dataproc-metastore-database -- projects/dataplex-types/locations/global/entryTypes/dataproc-metastore-service -- projects/dataplex-types/locations/global/entryTypes/dataproc-metastore-table -- projects/dataplex-types/locations/global/entryTypes/pubsub-topic -- projects/dataplex-types/locations/global/entryTypes/storage-bucket -- projects/dataplex-types/locations/global/entryTypes/storage-folder -- projects/dataplex-types/locations/global/entryTypes/vertexai-dataset -- projects/dataplex-types/locations/global/entryTypes/vertexai-feature-group -- projects/dataplex-types/locations/global/entryTypes/vertexai-feature-online-store - -## Entry Groups -Entries are organized within Entry Groups, which are logical groupings of Entries. An Entry Group acts as a namespace for its Entries. - -## Entry Links -Entries can be linked together using EntryLinks to represent relationships between data assets (e.g. foreign keys). - -# Tool instructions -## Tool: dataplex_search_entries -## General -- Do not try to search within search results on your own. -- Do not fetch multiple pages of results unless explicitly asked. - -## Search syntax - -### Simple search -In its simplest form, a search query consists of a single predicate. Such a predicate can match several pieces of metadata: - -- A substring of a name, display name, or description of a resource -- A substring of the type of a resource -- A substring of a column name (or nested column name) in the schema of a resource -- A substring of a project ID -- A string from an overview description - -For example, the predicate foo matches the following resources: -- Resource with the name foo.bar -- Resource with the display name Foo Bar -- Resource with the description This is the foo script -- Resource with the exact type foo -- Column foo_bar in the schema of a resource -- Nested column foo_bar in the schema of a resource -- Project prod-foo-bar -- Resource with an overview containing the word foo - - -### Qualified predicates -You can qualify a predicate by prefixing it with a key that restricts the matching to a specific piece of metadata: -- An equal sign (=) restricts the search to an exact match. -- A colon (:) after the key matches the predicate to either a substring or a token within the value in the search results. - -Tokenization splits the stream of text into a series of tokens, with each token usually corresponding to a single word. For example: -- name:foo selects resources with names that contain the foo substring, like foo1 and barfoo. -- description:foo selects resources with the foo token in the description, like bar and foo. -- location=foo matches resources in a specified location with foo as the location name. - -The predicate keys type, system, location, and orgid support only the exact match (=) qualifier, not the substring qualifier (:). For example, type=foo or orgid=number. - -Search syntax supports the following qualifiers: -- "name:x" - Matches x as a substring of the resource ID. -- "displayname:x" - Match x as a substring of the resource display name. -- "column:x" - Matches x as a substring of the column name (or nested column name) in the schema of the resource. -- "description:x" - Matches x as a token in the resource description. -- "label:bar" - Matches BigQuery resources that have a label (with some value) and the label key has bar as a substring. -- "label=bar" - Matches BigQuery resources that have a label (with some value) and the label key equals bar as a string. -- "label:bar:x" - Matches x as a substring in the value of a label with a key bar attached to a BigQuery resource. -- "label=foo:bar" - Matches BigQuery resources where the key equals foo and the key value equals bar. -- "label.foo=bar" - Matches BigQuery resources where the key equals foo and the key value equals bar. -- "label.foo" - Matches BigQuery resources that have a label whose key equals foo as a string. -- "type=TYPE" - Matches resources of a specific entry type or its type alias. -- "projectid:bar" - Matches resources within Google Cloud projects that match bar as a substring in the ID. -- "parent:x" - Matches x as a substring of the hierarchical path of a resource. It supports same syntax as `name` predicate. -- "orgid=number" - Matches resources within a Google Cloud organization with the exact ID value of the number. -- "system=SYSTEM" - Matches resources from a specified system. For example, system=bigquery matches BigQuery resources. -- "location=LOCATION" - Matches resources in a specified location with an exact name. For example, location=us-central1 matches assets hosted in Iowa. BigQuery Omni assets support this qualifier by using the BigQuery Omni location name. For example, location=aws-us-east-1 matches BigQuery Omni assets in Northern Virginia. -- "createtime" - -Finds resources that were created within, before, or after a given date or time. For example "createtime:2019-01-01" matches resources created on 2019-01-01. -- "updatetime" - Finds resources that were updated within, before, or after a given date or time. For example "updatetime>2019-01-01" matches resources updated after 2019-01-01. - -### Aspect Search -To search for entries based on their attached aspects, use the following query syntax. - -`has:x` -Matches `x` as a substring of the full path to the aspect type of an aspect that is attached to the entry, in the format `projectid.location.ASPECT_TYPE_ID` - -`has=x` -Matches `x` as the full path to the aspect type of an aspect that is attached to the entry, in the format `projectid.location.ASPECT_TYPE_ID` - -`xOPERATORvalue` -Searches for aspect field values. Matches x as a substring of the full path to the aspect type and field name of an aspect that is attached to the entry, in the format `projectid.location.ASPECT_TYPE_ID.FIELD_NAME` - -The list of supported operators depends on the type of field in the aspect, as follows: -* **String**: `=` (exact match) -* **All number types**: `=`, `:`, `<`, `>`, `<=`, `>=`, `=>`, `=<` -* **Enum**: `=` (exact match only) -* **Datetime**: same as for numbers, but the values to compare are treated as datetimes instead of numbers -* **Boolean**: `=` - -Only top-level fields of the aspect are searchable. - -* Syntax for system aspect types: - * `ASPECT_TYPE_ID.FIELD_NAME` - * `dataplex-types.ASPECT_TYPE_ID.FIELD_NAME` - * `dataplex-types.LOCATION.ASPECT_TYPE_ID.FIELD_NAME` -For example, the following queries match entries where the value of the `type` field in the `bigquery-dataset` aspect is `default`: - * `bigquery-dataset.type=default` - * `dataplex-types.bigquery-dataset.type=default` - * `dataplex-types.global.bigquery-dataset.type=default` -* Syntax for custom aspect types: - * If the aspect is created in the global region: `PROJECT_ID.ASPECT_TYPE_ID.FIELD_NAME` - * If the aspect is created in a specific region: `PROJECT_ID.REGION.ASPECT_TYPE_ID.FIELD_NAME` -For example, the following queries match entries where the value of the `is-enrolled` field in the `employee-info` aspect is `true`. - * `example-project.us-central1.employee-info.is-enrolled=true` - * `example-project.employee-info.is-enrolled=true` - -Example:- -You can use following filters -- dataplex-types.global.bigquery-table.type={BIGLAKE_TABLE, BIGLAKE_OBJECT_TABLE, EXTERNAL_TABLE, TABLE} -- dataplex-types.global.storage.type={STRUCTURED, UNSTRUCTURED} - -### Logical operators -A query can consist of several predicates with logical operators. If you don't specify an operator, logical AND is implied. For example, foo bar returns resources that match both predicate foo and predicate bar. -Logical AND and logical OR are supported. For example, foo OR bar. - -You can negate a predicate with a - (hyphen) or NOT prefix. For example, -name:foo returns resources with names that don't match the predicate foo. -Logical operators are case-sensitive. `OR` and `AND` are acceptable whereas `or` and `and` are not. - -### Abbreviated syntax - -An abbreviated search syntax is also available, using `|` (vertical bar) for `OR` operators and `,` (comma) for `AND` operators. - -For example, to search for entries inside one of many projects using the `OR` operator, you can use the following abbreviated syntax: - -`projectid:(id1|id2|id3|id4)` - -The same search without using abbreviated syntax looks like the following: - -`projectid:id1 OR projectid:id2 OR projectid:id3 OR projectid:id4` - -To search for entries with matching column names, use the following: - -* **AND**: `column:(name1,name2,name3)` -* **OR**: `column:(name1|name2|name3)` - -This abbreviated syntax works for the qualified predicates except for `label` in keyword search. - -### Request -1. Always try to rewrite the prompt using search syntax. - -### Response -1. If there are multiple search results found - 1. Present the list of search results - 2. Format the output in nested ordered list, for example: - Given - ``` - { - results: [ - { - name: "projects/test-project/locations/us/entryGroups/@bigquery-aws-us-east-1/entries/users" - entrySource: { - displayName: "Users" - description: "Table contains list of users." - location: "aws-us-east-1" - system: "BigQuery" - } - }, - { - name: "projects/another_project/locations/us-central1/entryGroups/@bigquery/entries/top_customers" - entrySource: { - displayName: "Top customers", - description: "Table contains list of best customers." - location: "us-central1" - system: "BigQuery" - } - }, - ] - } - ``` - Return output formatted as markdown nested list: - ``` - * Users: - - projectId: test_project - - location: aws-us-east-1 - - description: Table contains list of users. - * Top customers: - - projectId: another_project - - location: us-central1 - - description: Table contains list of best customers. - ``` - 3. Ask to select one of the presented search results -2. If there is only one search result found - 1. Present the search result immediately. -3. If there are no search result found - 1. Explain that no search result was found - 2. Suggest to provide a more specific search query. - -## Tool: dataplex_lookup_entry -### Request -1. Always try to limit the size of the response by specifying `aspect_types` parameter. Make sure to include to select view=CUSTOM when using aspect_types parameter. If you do not know the name of the aspect type, use the `dataplex_search_aspect_types` tool. -2. If you do not know the name of the entry, use `dataplex_search_entries` tool -### Response -1. Unless asked for a specific aspect, respond with all aspects attached to the entry. -``` \ No newline at end of file +--- \ No newline at end of file diff --git a/docs/en/integrations/dataplex/source.md b/docs/en/integrations/dataplex/source.md new file mode 100644 index 000000000000..0cdf75454aa3 --- /dev/null +++ b/docs/en/integrations/dataplex/source.md @@ -0,0 +1,368 @@ +--- +title: "Dataplex Source" +type: docs +linkTitle: "Source" +weight: 1 +description: > + Dataplex Universal Catalog is a unified, intelligent governance solution for data and AI assets in Google Cloud. Dataplex Universal Catalog powers AI, analytics, and business intelligence at scale. +no_list: true +--- + +## About + +[Dataplex][dataplex-docs] Universal Catalog is a unified, intelligent governance +solution for data and AI assets in Google Cloud. Dataplex Universal Catalog +powers AI, analytics, and business intelligence at scale. + +At the heart of these governance capabilities is a catalog that contains a +centralized inventory of the data assets in your organization. Dataplex +Universal Catalog holds business, technical, and runtime metadata for all of +your data. It helps you discover relationships and semantics in the metadata by +applying artificial intelligence and machine learning. + +[dataplex-docs]: https://cloud.google.com/dataplex/docs + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-dataplex-source +type: "dataplex" +project: "my-project-id" +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|----------------------------------------------------------------------------------| +| type | string | true | Must be "dataplex". | +| project | string | true | ID of the GCP project used for quota and billing purposes (e.g. "my-project-id").| + + +## Advanced Usage + +### Sample System Prompt + +You can use the following system prompt as "Custom Instructions" in your client +application. + +``` +# Objective +Your primary objective is to help discover, organize and manage metadata related to data assets. + +# Tone and Style +1. Adopt the persona of a senior subject matter expert +2. Your communication style must be: + 1. Concise: Always favor brevity. + 2. Direct: Avoid greetings (e.g., "Hi there!", "Certainly!"). Get straight to the point. + Example (Incorrect): Hi there! I see that you are looking for... + Example (Correct): This problem likely stems from... +3. Do not reiterate or summarize the question in the answer. +4. Crucially, always convey a tone of uncertainty and caution. Since you are interpreting metadata and have no way to externally verify your answers, never express complete confidence. Frame your responses as interpretations based solely on the provided metadata. Use a suggestive tone, not a prescriptive one: + Example (Correct): "The entry describes..." + Example (Correct): "According to catalog,..." + Example (Correct): "Based on the metadata,..." + Example (Correct): "Based on the search results,..." +5. Do not make assumptions + +# Data Model +## Entries +Entry represents a specific data asset. Entry acts as a metadata record for something that is managed by Catalog, such as: + +- A BigQuery table or dataset +- A Cloud Storage bucket or folder +- An on-premises SQL table + +## Aspects +While the Entry itself is a container, the rich descriptive information about the asset (e.g., schema, data types, business descriptions, classifications) is stored in associated components called Aspects. Aspects are created based on pre-defined blueprints known as Aspect Types. + +## Aspect Types +Aspect Type is a reusable template that defines the schema for a set of metadata fields. Think of an Aspect Type as a structure for the kind of metadata that is organized in the catalog within the Entry. + +Examples: +- projects/dataplex-types/locations/global/aspectTypes/analytics-hub-exchange +- projects/dataplex-types/locations/global/aspectTypes/analytics-hub +- projects/dataplex-types/locations/global/aspectTypes/analytics-hub-listing +- projects/dataplex-types/locations/global/aspectTypes/bigquery-connection +- projects/dataplex-types/locations/global/aspectTypes/bigquery-data-policy +- projects/dataplex-types/locations/global/aspectTypes/bigquery-dataset +- projects/dataplex-types/locations/global/aspectTypes/bigquery-model +- projects/dataplex-types/locations/global/aspectTypes/bigquery-policy +- projects/dataplex-types/locations/global/aspectTypes/bigquery-routine +- projects/dataplex-types/locations/global/aspectTypes/bigquery-row-access-policy +- projects/dataplex-types/locations/global/aspectTypes/bigquery-table +- projects/dataplex-types/locations/global/aspectTypes/bigquery-view +- projects/dataplex-types/locations/global/aspectTypes/cloud-bigtable-instance +- projects/dataplex-types/locations/global/aspectTypes/cloud-bigtable-table +- projects/dataplex-types/locations/global/aspectTypes/cloud-spanner-database +- projects/dataplex-types/locations/global/aspectTypes/cloud-spanner-instance +- projects/dataplex-types/locations/global/aspectTypes/cloud-spanner-table +- projects/dataplex-types/locations/global/aspectTypes/cloud-spanner-view +- projects/dataplex-types/locations/global/aspectTypes/cloudsql-database +- projects/dataplex-types/locations/global/aspectTypes/cloudsql-instance +- projects/dataplex-types/locations/global/aspectTypes/cloudsql-schema +- projects/dataplex-types/locations/global/aspectTypes/cloudsql-table +- projects/dataplex-types/locations/global/aspectTypes/cloudsql-view +- projects/dataplex-types/locations/global/aspectTypes/contacts +- projects/dataplex-types/locations/global/aspectTypes/dataform-code-asset +- projects/dataplex-types/locations/global/aspectTypes/dataform-repository +- projects/dataplex-types/locations/global/aspectTypes/dataform-workspace +- projects/dataplex-types/locations/global/aspectTypes/dataproc-metastore-database +- projects/dataplex-types/locations/global/aspectTypes/dataproc-metastore-service +- projects/dataplex-types/locations/global/aspectTypes/dataproc-metastore-table +- projects/dataplex-types/locations/global/aspectTypes/data-product +- projects/dataplex-types/locations/global/aspectTypes/data-quality-scorecard +- projects/dataplex-types/locations/global/aspectTypes/external-connection +- projects/dataplex-types/locations/global/aspectTypes/overview +- projects/dataplex-types/locations/global/aspectTypes/pubsub-topic +- projects/dataplex-types/locations/global/aspectTypes/schema +- projects/dataplex-types/locations/global/aspectTypes/sensitive-data-protection-job-result +- projects/dataplex-types/locations/global/aspectTypes/sensitive-data-protection-profile +- projects/dataplex-types/locations/global/aspectTypes/sql-access +- projects/dataplex-types/locations/global/aspectTypes/storage-bucket +- projects/dataplex-types/locations/global/aspectTypes/storage-folder +- projects/dataplex-types/locations/global/aspectTypes/storage +- projects/dataplex-types/locations/global/aspectTypes/usage + +## Entry Types +Every Entry must conform to an Entry Type. The Entry Type acts as a template, defining the structure, required aspects, and constraints for Entries of that type. + +Examples: +- projects/dataplex-types/locations/global/entryTypes/analytics-hub-exchange +- projects/dataplex-types/locations/global/entryTypes/analytics-hub-listing +- projects/dataplex-types/locations/global/entryTypes/bigquery-connection +- projects/dataplex-types/locations/global/entryTypes/bigquery-data-policy +- projects/dataplex-types/locations/global/entryTypes/bigquery-dataset +- projects/dataplex-types/locations/global/entryTypes/bigquery-model +- projects/dataplex-types/locations/global/entryTypes/bigquery-routine +- projects/dataplex-types/locations/global/entryTypes/bigquery-row-access-policy +- projects/dataplex-types/locations/global/entryTypes/bigquery-table +- projects/dataplex-types/locations/global/entryTypes/bigquery-view +- projects/dataplex-types/locations/global/entryTypes/cloud-bigtable-instance +- projects/dataplex-types/locations/global/entryTypes/cloud-bigtable-table +- projects/dataplex-types/locations/global/entryTypes/cloud-spanner-database +- projects/dataplex-types/locations/global/entryTypes/cloud-spanner-instance +- projects/dataplex-types/locations/global/entryTypes/cloud-spanner-table +- projects/dataplex-types/locations/global/entryTypes/cloud-spanner-view +- projects/dataplex-types/locations/global/entryTypes/cloudsql-mysql-database +- projects/dataplex-types/locations/global/entryTypes/cloudsql-mysql-instance +- projects/dataplex-types/locations/global/entryTypes/cloudsql-mysql-table +- projects/dataplex-types/locations/global/entryTypes/cloudsql-mysql-view +- projects/dataplex-types/locations/global/entryTypes/cloudsql-postgresql-database +- projects/dataplex-types/locations/global/entryTypes/cloudsql-postgresql-instance +- projects/dataplex-types/locations/global/entryTypes/cloudsql-postgresql-schema +- projects/dataplex-types/locations/global/entryTypes/cloudsql-postgresql-table +- projects/dataplex-types/locations/global/entryTypes/cloudsql-postgresql-view +- projects/dataplex-types/locations/global/entryTypes/cloudsql-sqlserver-database +- projects/dataplex-types/locations/global/entryTypes/cloudsql-sqlserver-instance +- projects/dataplex-types/locations/global/entryTypes/cloudsql-sqlserver-schema +- projects/dataplex-types/locations/global/entryTypes/cloudsql-sqlserver-table +- projects/dataplex-types/locations/global/entryTypes/cloudsql-sqlserver-view +- projects/dataplex-types/locations/global/entryTypes/dataform-code-asset +- projects/dataplex-types/locations/global/entryTypes/dataform-repository +- projects/dataplex-types/locations/global/entryTypes/dataform-workspace +- projects/dataplex-types/locations/global/entryTypes/dataproc-metastore-database +- projects/dataplex-types/locations/global/entryTypes/dataproc-metastore-service +- projects/dataplex-types/locations/global/entryTypes/dataproc-metastore-table +- projects/dataplex-types/locations/global/entryTypes/pubsub-topic +- projects/dataplex-types/locations/global/entryTypes/storage-bucket +- projects/dataplex-types/locations/global/entryTypes/storage-folder +- projects/dataplex-types/locations/global/entryTypes/vertexai-dataset +- projects/dataplex-types/locations/global/entryTypes/vertexai-feature-group +- projects/dataplex-types/locations/global/entryTypes/vertexai-feature-online-store + +## Entry Groups +Entries are organized within Entry Groups, which are logical groupings of Entries. An Entry Group acts as a namespace for its Entries. + +## Entry Links +Entries can be linked together using EntryLinks to represent relationships between data assets (e.g. foreign keys). + +# Tool instructions +## Tool: dataplex_search_entries +## General +- Do not try to search within search results on your own. +- Do not fetch multiple pages of results unless explicitly asked. + +## Search syntax + +### Simple search +In its simplest form, a search query consists of a single predicate. Such a predicate can match several pieces of metadata: + +- A substring of a name, display name, or description of a resource +- A substring of the type of a resource +- A substring of a column name (or nested column name) in the schema of a resource +- A substring of a project ID +- A string from an overview description + +For example, the predicate foo matches the following resources: +- Resource with the name foo.bar +- Resource with the display name Foo Bar +- Resource with the description This is the foo script +- Resource with the exact type foo +- Column foo_bar in the schema of a resource +- Nested column foo_bar in the schema of a resource +- Project prod-foo-bar +- Resource with an overview containing the word foo + + +### Qualified predicates +You can qualify a predicate by prefixing it with a key that restricts the matching to a specific piece of metadata: +- An equal sign (=) restricts the search to an exact match. +- A colon (:) after the key matches the predicate to either a substring or a token within the value in the search results. + +Tokenization splits the stream of text into a series of tokens, with each token usually corresponding to a single word. For example: +- name:foo selects resources with names that contain the foo substring, like foo1 and barfoo. +- description:foo selects resources with the foo token in the description, like bar and foo. +- location=foo matches resources in a specified location with foo as the location name. + +The predicate keys type, system, location, and orgid support only the exact match (=) qualifier, not the substring qualifier (:). For example, type=foo or orgid=number. + +Search syntax supports the following qualifiers: +- "name:x" - Matches x as a substring of the resource ID. +- "displayname:x" - Match x as a substring of the resource display name. +- "column:x" - Matches x as a substring of the column name (or nested column name) in the schema of the resource. +- "description:x" - Matches x as a token in the resource description. +- "label:bar" - Matches BigQuery resources that have a label (with some value) and the label key has bar as a substring. +- "label=bar" - Matches BigQuery resources that have a label (with some value) and the label key equals bar as a string. +- "label:bar:x" - Matches x as a substring in the value of a label with a key bar attached to a BigQuery resource. +- "label=foo:bar" - Matches BigQuery resources where the key equals foo and the key value equals bar. +- "label.foo=bar" - Matches BigQuery resources where the key equals foo and the key value equals bar. +- "label.foo" - Matches BigQuery resources that have a label whose key equals foo as a string. +- "type=TYPE" - Matches resources of a specific entry type or its type alias. +- "projectid:bar" - Matches resources within Google Cloud projects that match bar as a substring in the ID. +- "parent:x" - Matches x as a substring of the hierarchical path of a resource. It supports same syntax as `name` predicate. +- "orgid=number" - Matches resources within a Google Cloud organization with the exact ID value of the number. +- "system=SYSTEM" - Matches resources from a specified system. For example, system=bigquery matches BigQuery resources. +- "location=LOCATION" - Matches resources in a specified location with an exact name. For example, location=us-central1 matches assets hosted in Iowa. BigQuery Omni assets support this qualifier by using the BigQuery Omni location name. For example, location=aws-us-east-1 matches BigQuery Omni assets in Northern Virginia. +- "createtime" - +Finds resources that were created within, before, or after a given date or time. For example "createtime:2019-01-01" matches resources created on 2019-01-01. +- "updatetime" - Finds resources that were updated within, before, or after a given date or time. For example "updatetime>2019-01-01" matches resources updated after 2019-01-01. + +### Aspect Search +To search for entries based on their attached aspects, use the following query syntax. + +`has:x` +Matches `x` as a substring of the full path to the aspect type of an aspect that is attached to the entry, in the format `projectid.location.ASPECT_TYPE_ID` + +`has=x` +Matches `x` as the full path to the aspect type of an aspect that is attached to the entry, in the format `projectid.location.ASPECT_TYPE_ID` + +`xOPERATORvalue` +Searches for aspect field values. Matches x as a substring of the full path to the aspect type and field name of an aspect that is attached to the entry, in the format `projectid.location.ASPECT_TYPE_ID.FIELD_NAME` + +The list of supported operators depends on the type of field in the aspect, as follows: +* **String**: `=` (exact match) +* **All number types**: `=`, `:`, `<`, `>`, `<=`, `>=`, `=>`, `=<` +* **Enum**: `=` (exact match only) +* **Datetime**: same as for numbers, but the values to compare are treated as datetimes instead of numbers +* **Boolean**: `=` + +Only top-level fields of the aspect are searchable. + +* Syntax for system aspect types: + * `ASPECT_TYPE_ID.FIELD_NAME` + * `dataplex-types.ASPECT_TYPE_ID.FIELD_NAME` + * `dataplex-types.LOCATION.ASPECT_TYPE_ID.FIELD_NAME` +For example, the following queries match entries where the value of the `type` field in the `bigquery-dataset` aspect is `default`: + * `bigquery-dataset.type=default` + * `dataplex-types.bigquery-dataset.type=default` + * `dataplex-types.global.bigquery-dataset.type=default` +* Syntax for custom aspect types: + * If the aspect is created in the global region: `PROJECT_ID.ASPECT_TYPE_ID.FIELD_NAME` + * If the aspect is created in a specific region: `PROJECT_ID.REGION.ASPECT_TYPE_ID.FIELD_NAME` +For example, the following queries match entries where the value of the `is-enrolled` field in the `employee-info` aspect is `true`. + * `example-project.us-central1.employee-info.is-enrolled=true` + * `example-project.employee-info.is-enrolled=true` + +Example:- +You can use following filters +- dataplex-types.global.bigquery-table.type={BIGLAKE_TABLE, BIGLAKE_OBJECT_TABLE, EXTERNAL_TABLE, TABLE} +- dataplex-types.global.storage.type={STRUCTURED, UNSTRUCTURED} + +### Logical operators +A query can consist of several predicates with logical operators. If you don't specify an operator, logical AND is implied. For example, foo bar returns resources that match both predicate foo and predicate bar. +Logical AND and logical OR are supported. For example, foo OR bar. + +You can negate a predicate with a - (hyphen) or NOT prefix. For example, -name:foo returns resources with names that don't match the predicate foo. +Logical operators are case-sensitive. `OR` and `AND` are acceptable whereas `or` and `and` are not. + +### Abbreviated syntax + +An abbreviated search syntax is also available, using `|` (vertical bar) for `OR` operators and `,` (comma) for `AND` operators. + +For example, to search for entries inside one of many projects using the `OR` operator, you can use the following abbreviated syntax: + +`projectid:(id1|id2|id3|id4)` + +The same search without using abbreviated syntax looks like the following: + +`projectid:id1 OR projectid:id2 OR projectid:id3 OR projectid:id4` + +To search for entries with matching column names, use the following: + +* **AND**: `column:(name1,name2,name3)` +* **OR**: `column:(name1|name2|name3)` + +This abbreviated syntax works for the qualified predicates except for `label` in keyword search. + +### Request +1. Always try to rewrite the prompt using search syntax. + +### Response +1. If there are multiple search results found + 1. Present the list of search results + 2. Format the output in nested ordered list, for example: + Given + ``` + { + results: [ + { + name: "projects/test-project/locations/us/entryGroups/@bigquery-aws-us-east-1/entries/users" + entrySource: { + displayName: "Users" + description: "Table contains list of users." + location: "aws-us-east-1" + system: "BigQuery" + } + }, + { + name: "projects/another_project/locations/us-central1/entryGroups/@bigquery/entries/top_customers" + entrySource: { + displayName: "Top customers", + description: "Table contains list of best customers." + location: "us-central1" + system: "BigQuery" + } + }, + ] + } + ``` + Return output formatted as markdown nested list: + ``` + * Users: + - projectId: test_project + - location: aws-us-east-1 + - description: Table contains list of users. + * Top customers: + - projectId: another_project + - location: us-central1 + - description: Table contains list of best customers. + ``` + 3. Ask to select one of the presented search results +2. If there is only one search result found + 1. Present the search result immediately. +3. If there are no search result found + 1. Explain that no search result was found + 2. Suggest to provide a more specific search query. + +## Tool: dataplex_lookup_entry +### Request +1. Always try to limit the size of the response by specifying `aspect_types` parameter. Make sure to include to select view=CUSTOM when using aspect_types parameter. If you do not know the name of the aspect type, use the `dataplex_search_aspect_types` tool. +2. If you do not know the name of the entry, use `dataplex_search_entries` tool +### Response +1. Unless asked for a specific aspect, respond with all aspects attached to the entry. +``` \ No newline at end of file diff --git a/docs/en/integrations/dataplex/tools/_index.md b/docs/en/integrations/dataplex/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/dataplex/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/dataplex/dataplex-lookup-entry.md b/docs/en/integrations/dataplex/tools/dataplex-lookup-entry.md similarity index 98% rename from docs/en/integrations/dataplex/dataplex-lookup-entry.md rename to docs/en/integrations/dataplex/tools/dataplex-lookup-entry.md index 74996560de7a..cb3ca1015b63 100644 --- a/docs/en/integrations/dataplex/dataplex-lookup-entry.md +++ b/docs/en/integrations/dataplex/tools/dataplex-lookup-entry.md @@ -1,5 +1,5 @@ --- -title: "dataplex-lookup-entry Tool" +title: "dataplex-lookup-entry" type: docs weight: 1 description: > diff --git a/docs/en/integrations/dataplex/dataplex-search-aspect-types.md b/docs/en/integrations/dataplex/tools/dataplex-search-aspect-types.md similarity index 98% rename from docs/en/integrations/dataplex/dataplex-search-aspect-types.md rename to docs/en/integrations/dataplex/tools/dataplex-search-aspect-types.md index 2db5ce40f853..a1c99bb5ade1 100644 --- a/docs/en/integrations/dataplex/dataplex-search-aspect-types.md +++ b/docs/en/integrations/dataplex/tools/dataplex-search-aspect-types.md @@ -1,5 +1,5 @@ --- -title: "dataplex-search-aspect-types Tool" +title: "dataplex-search-aspect-types" type: docs weight: 1 description: > diff --git a/docs/en/integrations/dataplex/dataplex-search-entries.md b/docs/en/integrations/dataplex/tools/dataplex-search-entries.md similarity index 98% rename from docs/en/integrations/dataplex/dataplex-search-entries.md rename to docs/en/integrations/dataplex/tools/dataplex-search-entries.md index 3ca7f4d6d1bc..904ea9d386ae 100644 --- a/docs/en/integrations/dataplex/dataplex-search-entries.md +++ b/docs/en/integrations/dataplex/tools/dataplex-search-entries.md @@ -1,5 +1,5 @@ --- -title: "dataplex-search-entries Tool" +title: "dataplex-search-entries" type: docs weight: 1 description: > diff --git a/docs/en/integrations/dgraph/_index.md b/docs/en/integrations/dgraph/_index.md index 69086a1926fc..77a20d19b56b 100644 --- a/docs/en/integrations/dgraph/_index.md +++ b/docs/en/integrations/dgraph/_index.md @@ -1,79 +1,4 @@ --- -title: "Dgraph Source" -type: docs +title: "Dgraph" weight: 1 -description: > - Dgraph is fully open-source, built-for-scale graph database for Gen AI workloads -no_list: true ---- - -{{< notice note >}} -**⚠️ Best Effort Maintenance** - -This integration is maintained on a best-effort basis by the project -team/community. While we strive to address issues and provide workarounds when -resources are available, there are no guaranteed response times or code fixes. - -The automated integration tests for this module are currently non-functional or -failing. -{{< /notice >}} - -## About - -[Dgraph][dgraph-docs] is an open-source graph database. It is designed for -real-time workloads, horizontal scalability, and data flexibility. Implemented -as a distributed system, Dgraph processes queries in parallel to deliver the -fastest result. - -This source can connect to either a self-managed Dgraph cluster or one hosted on -Dgraph Cloud. If you're new to Dgraph, the fastest way to get started is to -[sign up for Dgraph Cloud][dgraph-login]. - -[dgraph-docs]: https://dgraph.io/docs -[dgraph-login]: https://cloud.dgraph.io/login - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -When **connecting to a hosted Dgraph database**, this source uses the API key -for access. If you are using a dedicated environment, you will additionally need -the namespace and user credentials for that namespace. - -For **connecting to a local or self-hosted Dgraph database**, use the namespace -and user credentials for that namespace. - -## Example - -```yaml -kind: sources -name: my-dgraph-source -type: dgraph -dgraphUrl: https://xxxx.cloud.dgraph.io -user: ${USER_NAME} -password: ${PASSWORD} -apiKey: ${API_KEY} -namespace : 0 -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **Field** | **Type** | **Required** | **Description** | -|-------------|:--------:|:------------:|--------------------------------------------------------------------------------------------------| -| type | string | true | Must be "dgraph". | -| dgraphUrl | string | true | Connection URI (e.g. "", ""). | -| user | string | false | Name of the Dgraph user to connect as (e.g., "groot"). | -| password | string | false | Password of the Dgraph user (e.g., "password"). | -| apiKey | string | false | API key to connect to a Dgraph Cloud instance. | -| namespace | uint64 | false | Dgraph namespace (not required for Dgraph Cloud Shared Clusters). | +--- \ No newline at end of file diff --git a/docs/en/integrations/dgraph/source.md b/docs/en/integrations/dgraph/source.md new file mode 100644 index 000000000000..bb25493b1c5c --- /dev/null +++ b/docs/en/integrations/dgraph/source.md @@ -0,0 +1,80 @@ +--- +title: "Dgraph Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Dgraph is fully open-source, built-for-scale graph database for Gen AI workloads +no_list: true +--- + +{{< notice note >}} +**⚠️ Best Effort Maintenance** + +This integration is maintained on a best-effort basis by the project +team/community. While we strive to address issues and provide workarounds when +resources are available, there are no guaranteed response times or code fixes. + +The automated integration tests for this module are currently non-functional or +failing. +{{< /notice >}} + +## About + +[Dgraph][dgraph-docs] is an open-source graph database. It is designed for +real-time workloads, horizontal scalability, and data flexibility. Implemented +as a distributed system, Dgraph processes queries in parallel to deliver the +fastest result. + +This source can connect to either a self-managed Dgraph cluster or one hosted on +Dgraph Cloud. If you're new to Dgraph, the fastest way to get started is to +[sign up for Dgraph Cloud][dgraph-login]. + +[dgraph-docs]: https://dgraph.io/docs +[dgraph-login]: https://cloud.dgraph.io/login + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +When **connecting to a hosted Dgraph database**, this source uses the API key +for access. If you are using a dedicated environment, you will additionally need +the namespace and user credentials for that namespace. + +For **connecting to a local or self-hosted Dgraph database**, use the namespace +and user credentials for that namespace. + +## Example + +```yaml +kind: sources +name: my-dgraph-source +type: dgraph +dgraphUrl: https://xxxx.cloud.dgraph.io +user: ${USER_NAME} +password: ${PASSWORD} +apiKey: ${API_KEY} +namespace : 0 +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **Field** | **Type** | **Required** | **Description** | +|-------------|:--------:|:------------:|--------------------------------------------------------------------------------------------------| +| type | string | true | Must be "dgraph". | +| dgraphUrl | string | true | Connection URI (e.g. "", ""). | +| user | string | false | Name of the Dgraph user to connect as (e.g., "groot"). | +| password | string | false | Password of the Dgraph user (e.g., "password"). | +| apiKey | string | false | API key to connect to a Dgraph Cloud instance. | +| namespace | uint64 | false | Dgraph namespace (not required for Dgraph Cloud Shared Clusters). | diff --git a/docs/en/integrations/dgraph/tools/_index.md b/docs/en/integrations/dgraph/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/dgraph/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/dgraph/dgraph-dql.md b/docs/en/integrations/dgraph/tools/dgraph-dql.md similarity index 99% rename from docs/en/integrations/dgraph/dgraph-dql.md rename to docs/en/integrations/dgraph/tools/dgraph-dql.md index df37d06a09aa..481e2809bf52 100644 --- a/docs/en/integrations/dgraph/dgraph-dql.md +++ b/docs/en/integrations/dgraph/tools/dgraph-dql.md @@ -1,5 +1,5 @@ --- -title: "dgraph-dql Tool" +title: "dgraph-dql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/elasticsearch/_index.md b/docs/en/integrations/elasticsearch/_index.md index cb97145487b2..8f3b65cb9786 100644 --- a/docs/en/integrations/elasticsearch/_index.md +++ b/docs/en/integrations/elasticsearch/_index.md @@ -1,78 +1,4 @@ --- -title: "Elasticsearch Source" -type: docs +title: "Elasticsearch" weight: 1 -description: > - Elasticsearch is a distributed, free and open search and analytics engine - for all types of data, including textual, numerical, geospatial, structured, - and unstructured. -no_list: true ---- - -## About - -[Elasticsearch][elasticsearch-docs] is a distributed, free and open search and -analytics engine for all types of data, including textual, numerical, -geospatial, structured, and unstructured. - -If you are new to Elasticsearch, you can learn how to -[set up a cluster and start indexing data][elasticsearch-quickstart]. - -Elasticsearch uses [ES|QL][elasticsearch-esql] for querying data. ES|QL -is a powerful query language that allows you to search and aggregate data in -Elasticsearch. - -See the [official -documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html) -for more information. - -[elasticsearch-docs]: - https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html -[elasticsearch-quickstart]: - https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html -[elasticsearch-esql]: - https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### API Key - -Toolbox uses an [API key][api-key] to authorize and authenticate when -interacting with [Elasticsearch][elasticsearch-docs]. - -In addition to [setting the API key for your server][set-api-key], you need to -ensure the API key has the correct permissions for the queries you intend to -run. See [API key management][api-key-management] for more information on -applying permissions to an API key. - -[api-key]: - https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html -[set-api-key]: - https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html -[api-key-management]: - https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html - -## Example - -```yaml -kind: sources -name: my-elasticsearch-source -type: "elasticsearch" -addresses: - - "http://localhost:9200" -apikey: "my-api-key" -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|--------------------------------------------| -| type | string | true | Must be "elasticsearch". | -| addresses | []string | true | List of Elasticsearch hosts to connect to. | -| apikey | string | true | The API key to use for authentication. | +--- \ No newline at end of file diff --git a/docs/en/integrations/elasticsearch/source.md b/docs/en/integrations/elasticsearch/source.md new file mode 100644 index 000000000000..efcffa0eb9cd --- /dev/null +++ b/docs/en/integrations/elasticsearch/source.md @@ -0,0 +1,79 @@ +--- +title: "Elasticsearch Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Elasticsearch is a distributed, free and open search and analytics engine + for all types of data, including textual, numerical, geospatial, structured, + and unstructured. +no_list: true +--- + +## About + +[Elasticsearch][elasticsearch-docs] is a distributed, free and open search and +analytics engine for all types of data, including textual, numerical, +geospatial, structured, and unstructured. + +If you are new to Elasticsearch, you can learn how to +[set up a cluster and start indexing data][elasticsearch-quickstart]. + +Elasticsearch uses [ES|QL][elasticsearch-esql] for querying data. ES|QL +is a powerful query language that allows you to search and aggregate data in +Elasticsearch. + +See the [official +documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html) +for more information. + +[elasticsearch-docs]: + https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html +[elasticsearch-quickstart]: + https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html +[elasticsearch-esql]: + https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### API Key + +Toolbox uses an [API key][api-key] to authorize and authenticate when +interacting with [Elasticsearch][elasticsearch-docs]. + +In addition to [setting the API key for your server][set-api-key], you need to +ensure the API key has the correct permissions for the queries you intend to +run. See [API key management][api-key-management] for more information on +applying permissions to an API key. + +[api-key]: + https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html +[set-api-key]: + https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html +[api-key-management]: + https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html + +## Example + +```yaml +kind: sources +name: my-elasticsearch-source +type: "elasticsearch" +addresses: + - "http://localhost:9200" +apikey: "my-api-key" +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|--------------------------------------------| +| type | string | true | Must be "elasticsearch". | +| addresses | []string | true | List of Elasticsearch hosts to connect to. | +| apikey | string | true | The API key to use for authentication. | diff --git a/docs/en/integrations/elasticsearch/tools/_index.md b/docs/en/integrations/elasticsearch/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/elasticsearch/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/elasticsearch/elasticsearch-esql.md b/docs/en/integrations/elasticsearch/tools/elasticsearch-esql.md similarity index 98% rename from docs/en/integrations/elasticsearch/elasticsearch-esql.md rename to docs/en/integrations/elasticsearch/tools/elasticsearch-esql.md index 9fba13a0bdcb..081006b9785f 100644 --- a/docs/en/integrations/elasticsearch/elasticsearch-esql.md +++ b/docs/en/integrations/elasticsearch/tools/elasticsearch-esql.md @@ -1,5 +1,5 @@ --- -title: "elasticsearch-esql Tool" +title: "elasticsearch-esql" type: docs weight: 2 description: > diff --git a/docs/en/integrations/firebird/_index.md b/docs/en/integrations/firebird/_index.md index 05fcacd81fec..27bbd92b6a5f 100644 --- a/docs/en/integrations/firebird/_index.md +++ b/docs/en/integrations/firebird/_index.md @@ -1,61 +1,4 @@ --- -title: "Firebird Source" -type: docs +title: "Firebird" weight: 1 -description: > - Firebird is a powerful, cross-platform, and open-source relational database. -no_list: true ---- - -## About - -[Firebird][fb-docs] is a relational database management system offering many -ANSI SQL standard features that runs on Linux, Windows, and a variety of Unix -platforms. It is known for its small footprint, powerful features, and easy -maintenance. - -[fb-docs]: https://firebirdsql.org/ - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source uses standard authentication. You will need to [create a Firebird -user][fb-users] to login to the database with. - -[fb-users]: https://www.firebirdsql.org/refdocs/langrefupd25-security-sql-user-mgmt.html#langrefupd25-security-create-user - -## Example - -```yaml -kind: sources -name: my_firebird_db -type: firebird -host: "localhost" -port: 3050 -database: "/path/to/your/database.fdb" -user: ${FIREBIRD_USER} -password: ${FIREBIRD_PASS} -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|------------------------------------------------------------------------------| -| type | string | true | Must be "firebird". | -| host | string | true | IP address to connect to (e.g. "127.0.0.1") | -| port | string | true | Port to connect to (e.g. "3050") | -| database | string | true | Path to the Firebird database file (e.g. "/var/lib/firebird/data/test.fdb"). | -| user | string | true | Name of the Firebird user to connect as (e.g. "SYSDBA"). | -| password | string | true | Password of the Firebird user (e.g. "masterkey"). | +--- \ No newline at end of file diff --git a/docs/en/integrations/firebird/source.md b/docs/en/integrations/firebird/source.md new file mode 100644 index 000000000000..916a632c5619 --- /dev/null +++ b/docs/en/integrations/firebird/source.md @@ -0,0 +1,62 @@ +--- +title: "Firebird Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Firebird is a powerful, cross-platform, and open-source relational database. +no_list: true +--- + +## About + +[Firebird][fb-docs] is a relational database management system offering many +ANSI SQL standard features that runs on Linux, Windows, and a variety of Unix +platforms. It is known for its small footprint, powerful features, and easy +maintenance. + +[fb-docs]: https://firebirdsql.org/ + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source uses standard authentication. You will need to [create a Firebird +user][fb-users] to login to the database with. + +[fb-users]: https://www.firebirdsql.org/refdocs/langrefupd25-security-sql-user-mgmt.html#langrefupd25-security-create-user + +## Example + +```yaml +kind: sources +name: my_firebird_db +type: firebird +host: "localhost" +port: 3050 +database: "/path/to/your/database.fdb" +user: ${FIREBIRD_USER} +password: ${FIREBIRD_PASS} +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|------------------------------------------------------------------------------| +| type | string | true | Must be "firebird". | +| host | string | true | IP address to connect to (e.g. "127.0.0.1") | +| port | string | true | Port to connect to (e.g. "3050") | +| database | string | true | Path to the Firebird database file (e.g. "/var/lib/firebird/data/test.fdb"). | +| user | string | true | Name of the Firebird user to connect as (e.g. "SYSDBA"). | +| password | string | true | Password of the Firebird user (e.g. "masterkey"). | diff --git a/docs/en/integrations/firebird/tools/_index.md b/docs/en/integrations/firebird/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/firebird/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/firebird/firebird-execute-sql.md b/docs/en/integrations/firebird/tools/firebird-execute-sql.md similarity index 97% rename from docs/en/integrations/firebird/firebird-execute-sql.md rename to docs/en/integrations/firebird/tools/firebird-execute-sql.md index 8520b891fbf9..9ce8ae929af2 100644 --- a/docs/en/integrations/firebird/firebird-execute-sql.md +++ b/docs/en/integrations/firebird/tools/firebird-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "firebird-execute-sql Tool" +title: "firebird-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/firebird/firebird-sql.md b/docs/en/integrations/firebird/tools/firebird-sql.md similarity index 99% rename from docs/en/integrations/firebird/firebird-sql.md rename to docs/en/integrations/firebird/tools/firebird-sql.md index 490e569017c6..77cece349dd2 100644 --- a/docs/en/integrations/firebird/firebird-sql.md +++ b/docs/en/integrations/firebird/tools/firebird-sql.md @@ -1,5 +1,5 @@ --- -title: "firebird-sql Tool" +title: "firebird-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/firestore/_index.md b/docs/en/integrations/firestore/_index.md index 0e8e40f64c3f..80ef3d948065 100644 --- a/docs/en/integrations/firestore/_index.md +++ b/docs/en/integrations/firestore/_index.md @@ -1,83 +1,4 @@ --- -title: "Firestore Source" -type: docs +title: "Firestore" weight: 1 -description: > - Firestore is a NoSQL document database built for automatic scaling, high performance, and ease of application development. It's a fully managed, serverless database that supports mobile, web, and server development. -no_list: true ---- - -## About - -[Firestore][firestore-docs] is a NoSQL document database built for automatic -scaling, high performance, and ease of application development. While the -Firestore interface has many of the same features as traditional databases, -as a NoSQL database it differs from them in the way it describes relationships -between data objects. - -If you are new to Firestore, you can [create a database and learn the -basics][firestore-quickstart]. - -[firestore-docs]: https://cloud.google.com/firestore/docs -[firestore-quickstart]: https://cloud.google.com/firestore/docs/quickstart-servers - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### IAM Permissions - -Firestore uses [Identity and Access Management (IAM)][iam-overview] to control -user and group access to Firestore resources. Toolbox will use your [Application -Default Credentials (ADC)][adc] to authorize and authenticate when interacting -with [Firestore][firestore-docs]. - -In addition to [setting the ADC for your server][set-adc], you need to ensure -the IAM identity has been given the correct IAM permissions for accessing -Firestore. Common roles include: - -- `roles/datastore.user` - Read and write access to Firestore -- `roles/datastore.viewer` - Read-only access to Firestore -- `roles/firebaserules.admin` - Full management of Firebase Security Rules for - Firestore. This role is required for operations that involve creating, - updating, or managing Firestore security rules (see [Firebase Security Rules - roles][firebaserules-roles]) - -See [Firestore access control][firestore-iam] for more information on -applying IAM permissions and roles to an identity. - -[iam-overview]: https://cloud.google.com/firestore/docs/security/iam -[adc]: https://cloud.google.com/docs/authentication#adc -[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc -[firestore-iam]: https://cloud.google.com/firestore/docs/security/iam -[firebaserules-roles]: - https://cloud.google.com/iam/docs/roles-permissions/firebaserules - -### Database Selection - -Firestore allows you to create multiple databases within a single project. Each -database is isolated from the others and has its own set of documents and -collections. If you don't specify a database in your configuration, the default -database named `(default)` will be used. - -## Example - -```yaml -kind: sources -name: my-firestore-source -type: "firestore" -project: "my-project-id" -# database: "my-database" # Optional, defaults to "(default)" -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|----------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "firestore". | -| project | string | true | Id of the GCP project that contains the Firestore database (e.g. "my-project-id"). | -| database | string | false | Name of the Firestore database to connect to. Defaults to "(default)" if not specified. | +--- \ No newline at end of file diff --git a/docs/en/integrations/firestore/source.md b/docs/en/integrations/firestore/source.md new file mode 100644 index 000000000000..b22f11f989b9 --- /dev/null +++ b/docs/en/integrations/firestore/source.md @@ -0,0 +1,84 @@ +--- +title: "Firestore Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Firestore is a NoSQL document database built for automatic scaling, high performance, and ease of application development. It's a fully managed, serverless database that supports mobile, web, and server development. +no_list: true +--- + +## About + +[Firestore][firestore-docs] is a NoSQL document database built for automatic +scaling, high performance, and ease of application development. While the +Firestore interface has many of the same features as traditional databases, +as a NoSQL database it differs from them in the way it describes relationships +between data objects. + +If you are new to Firestore, you can [create a database and learn the +basics][firestore-quickstart]. + +[firestore-docs]: https://cloud.google.com/firestore/docs +[firestore-quickstart]: https://cloud.google.com/firestore/docs/quickstart-servers + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### IAM Permissions + +Firestore uses [Identity and Access Management (IAM)][iam-overview] to control +user and group access to Firestore resources. Toolbox will use your [Application +Default Credentials (ADC)][adc] to authorize and authenticate when interacting +with [Firestore][firestore-docs]. + +In addition to [setting the ADC for your server][set-adc], you need to ensure +the IAM identity has been given the correct IAM permissions for accessing +Firestore. Common roles include: + +- `roles/datastore.user` - Read and write access to Firestore +- `roles/datastore.viewer` - Read-only access to Firestore +- `roles/firebaserules.admin` - Full management of Firebase Security Rules for + Firestore. This role is required for operations that involve creating, + updating, or managing Firestore security rules (see [Firebase Security Rules + roles][firebaserules-roles]) + +See [Firestore access control][firestore-iam] for more information on +applying IAM permissions and roles to an identity. + +[iam-overview]: https://cloud.google.com/firestore/docs/security/iam +[adc]: https://cloud.google.com/docs/authentication#adc +[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc +[firestore-iam]: https://cloud.google.com/firestore/docs/security/iam +[firebaserules-roles]: + https://cloud.google.com/iam/docs/roles-permissions/firebaserules + +### Database Selection + +Firestore allows you to create multiple databases within a single project. Each +database is isolated from the others and has its own set of documents and +collections. If you don't specify a database in your configuration, the default +database named `(default)` will be used. + +## Example + +```yaml +kind: sources +name: my-firestore-source +type: "firestore" +project: "my-project-id" +# database: "my-database" # Optional, defaults to "(default)" +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|----------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "firestore". | +| project | string | true | Id of the GCP project that contains the Firestore database (e.g. "my-project-id"). | +| database | string | false | Name of the Firestore database to connect to. Defaults to "(default)" if not specified. | diff --git a/docs/en/integrations/firestore/tools/_index.md b/docs/en/integrations/firestore/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/firestore/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/firestore/firestore-add-documents.md b/docs/en/integrations/firestore/tools/firestore-add-documents.md similarity index 99% rename from docs/en/integrations/firestore/firestore-add-documents.md rename to docs/en/integrations/firestore/tools/firestore-add-documents.md index de2d53a9e6cb..a4740a8ed096 100644 --- a/docs/en/integrations/firestore/firestore-add-documents.md +++ b/docs/en/integrations/firestore/tools/firestore-add-documents.md @@ -1,5 +1,5 @@ --- -title: "firestore-add-documents Tool" +title: "firestore-add-documents" type: docs weight: 1 description: > diff --git a/docs/en/integrations/firestore/firestore-delete-documents.md b/docs/en/integrations/firestore/tools/firestore-delete-documents.md similarity index 96% rename from docs/en/integrations/firestore/firestore-delete-documents.md rename to docs/en/integrations/firestore/tools/firestore-delete-documents.md index f848c5f165b1..122b560da1da 100644 --- a/docs/en/integrations/firestore/firestore-delete-documents.md +++ b/docs/en/integrations/firestore/tools/firestore-delete-documents.md @@ -1,5 +1,5 @@ --- -title: "firestore-delete-documents Tool" +title: "firestore-delete-documents" type: docs weight: 1 description: > diff --git a/docs/en/integrations/firestore/firestore-get-documents.md b/docs/en/integrations/firestore/tools/firestore-get-documents.md similarity index 97% rename from docs/en/integrations/firestore/firestore-get-documents.md rename to docs/en/integrations/firestore/tools/firestore-get-documents.md index 1647d82ecc66..c750b603c227 100644 --- a/docs/en/integrations/firestore/firestore-get-documents.md +++ b/docs/en/integrations/firestore/tools/firestore-get-documents.md @@ -1,5 +1,5 @@ --- -title: "firestore-get-documents Tool" +title: "firestore-get-documents" type: docs weight: 1 description: > diff --git a/docs/en/integrations/firestore/firestore-get-rules.md b/docs/en/integrations/firestore/tools/firestore-get-rules.md similarity index 97% rename from docs/en/integrations/firestore/firestore-get-rules.md rename to docs/en/integrations/firestore/tools/firestore-get-rules.md index 5d0bbd342bee..f7974b08841a 100644 --- a/docs/en/integrations/firestore/firestore-get-rules.md +++ b/docs/en/integrations/firestore/tools/firestore-get-rules.md @@ -1,5 +1,5 @@ --- -title: "firestore-get-rules Tool" +title: "firestore-get-rules" type: docs weight: 1 description: > diff --git a/docs/en/integrations/firestore/firestore-list-collections.md b/docs/en/integrations/firestore/tools/firestore-list-collections.md similarity index 97% rename from docs/en/integrations/firestore/firestore-list-collections.md rename to docs/en/integrations/firestore/tools/firestore-list-collections.md index c028b98035ce..3966df19e3b6 100644 --- a/docs/en/integrations/firestore/firestore-list-collections.md +++ b/docs/en/integrations/firestore/tools/firestore-list-collections.md @@ -1,5 +1,5 @@ --- -title: "firestore-list-collections Tool" +title: "firestore-list-collections" type: docs weight: 1 description: > diff --git a/docs/en/integrations/firestore/firestore-query-collection.md b/docs/en/integrations/firestore/tools/firestore-query-collection.md similarity index 99% rename from docs/en/integrations/firestore/firestore-query-collection.md rename to docs/en/integrations/firestore/tools/firestore-query-collection.md index fea0893cce3f..57281f12c4d7 100644 --- a/docs/en/integrations/firestore/firestore-query-collection.md +++ b/docs/en/integrations/firestore/tools/firestore-query-collection.md @@ -1,5 +1,5 @@ --- -title: "firestore-query-collection Tool" +title: "firestore-query-collection" type: docs weight: 1 description: > diff --git a/docs/en/integrations/firestore/firestore-query.md b/docs/en/integrations/firestore/tools/firestore-query.md similarity index 99% rename from docs/en/integrations/firestore/firestore-query.md rename to docs/en/integrations/firestore/tools/firestore-query.md index 3d565606a20c..26781f72ba64 100644 --- a/docs/en/integrations/firestore/firestore-query.md +++ b/docs/en/integrations/firestore/tools/firestore-query.md @@ -1,5 +1,5 @@ --- -title: "firestore-query Tool" +title: "firestore-query" type: docs weight: 1 description: > diff --git a/docs/en/integrations/firestore/firestore-update-document.md b/docs/en/integrations/firestore/tools/firestore-update-document.md similarity index 99% rename from docs/en/integrations/firestore/firestore-update-document.md rename to docs/en/integrations/firestore/tools/firestore-update-document.md index 606ebe9d99b9..5b9b71110a08 100644 --- a/docs/en/integrations/firestore/firestore-update-document.md +++ b/docs/en/integrations/firestore/tools/firestore-update-document.md @@ -1,5 +1,5 @@ --- -title: "firestore-update-document Tool" +title: "firestore-update-document" type: docs weight: 1 description: > diff --git a/docs/en/integrations/firestore/firestore-validate-rules.md b/docs/en/integrations/firestore/tools/firestore-validate-rules.md similarity index 98% rename from docs/en/integrations/firestore/firestore-validate-rules.md rename to docs/en/integrations/firestore/tools/firestore-validate-rules.md index a8f2cc1111f5..9932e0f15870 100644 --- a/docs/en/integrations/firestore/firestore-validate-rules.md +++ b/docs/en/integrations/firestore/tools/firestore-validate-rules.md @@ -1,5 +1,5 @@ --- -title: "firestore-validate-rules Tool" +title: "firestore-validate-rules" type: docs weight: 1 description: > diff --git a/docs/en/integrations/http/_index.md b/docs/en/integrations/http/_index.md index 2ca331bc1be5..c8e006fece0f 100644 --- a/docs/en/integrations/http/_index.md +++ b/docs/en/integrations/http/_index.md @@ -1,56 +1,4 @@ --- -title: "HTTP Source" -linkTitle: "HTTP" -type: docs +title: "HTTP" weight: 1 -description: > - The HTTP source enables the Toolbox to retrieve data from a remote server using HTTP requests. -no_list: true ---- - -## About - -The HTTP Source allows Toolbox to retrieve data from arbitrary HTTP -endpoints. This enables Generative AI applications to access data from web APIs -and other HTTP-accessible resources. - - - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-http-source -type: http -baseUrl: https://api.example.com/data -timeout: 10s # default to 30s -headers: - Authorization: Bearer ${API_KEY} - Content-Type: application/json -queryParams: - param1: value1 - param2: value2 -# disableSslVerification: false -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|------------------------|:-----------------:|:------------:|------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "http". | -| baseUrl | string | true | The base URL for the HTTP requests (e.g., `https://api.example.com`). | -| timeout | string | false | The timeout for HTTP requests (e.g., "5s", "1m", refer to [ParseDuration][parse-duration-doc] for more examples). Defaults to 30s. | -| headers | map[string]string | false | Default headers to include in the HTTP requests. | -| queryParams | map[string]string | false | Default query parameters to include in the HTTP requests. | -| disableSslVerification | bool | false | Disable SSL certificate verification. This should only be used for local development. Defaults to `false`. | - -[parse-duration-doc]: https://pkg.go.dev/time#ParseDuration +--- \ No newline at end of file diff --git a/docs/en/integrations/http/source.md b/docs/en/integrations/http/source.md new file mode 100644 index 000000000000..c79e54a7aa46 --- /dev/null +++ b/docs/en/integrations/http/source.md @@ -0,0 +1,56 @@ +--- +title: "HTTP Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + The HTTP source enables the Toolbox to retrieve data from a remote server using HTTP requests. +no_list: true +--- + +## About + +The HTTP Source allows Toolbox to retrieve data from arbitrary HTTP +endpoints. This enables Generative AI applications to access data from web APIs +and other HTTP-accessible resources. + + + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-http-source +type: http +baseUrl: https://api.example.com/data +timeout: 10s # default to 30s +headers: + Authorization: Bearer ${API_KEY} + Content-Type: application/json +queryParams: + param1: value1 + param2: value2 +# disableSslVerification: false +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|------------------------|:-----------------:|:------------:|------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "http". | +| baseUrl | string | true | The base URL for the HTTP requests (e.g., `https://api.example.com`). | +| timeout | string | false | The timeout for HTTP requests (e.g., "5s", "1m", refer to [ParseDuration][parse-duration-doc] for more examples). Defaults to 30s. | +| headers | map[string]string | false | Default headers to include in the HTTP requests. | +| queryParams | map[string]string | false | Default query parameters to include in the HTTP requests. | +| disableSslVerification | bool | false | Disable SSL certificate verification. This should only be used for local development. Defaults to `false`. | + +[parse-duration-doc]: https://pkg.go.dev/time#ParseDuration diff --git a/docs/en/integrations/http/tools/_index.md b/docs/en/integrations/http/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/http/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/http/http-tool.md b/docs/en/integrations/http/tools/http-tool.md similarity index 99% rename from docs/en/integrations/http/http-tool.md rename to docs/en/integrations/http/tools/http-tool.md index 7e459b94f113..c1a140ee1049 100644 --- a/docs/en/integrations/http/http-tool.md +++ b/docs/en/integrations/http/tools/http-tool.md @@ -1,5 +1,5 @@ --- -title: "http Tool" +title: "http" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/_index.md b/docs/en/integrations/looker/_index.md index 42b217d0f60a..823a1f08b863 100644 --- a/docs/en/integrations/looker/_index.md +++ b/docs/en/integrations/looker/_index.md @@ -1,115 +1,4 @@ --- -title: "Looker Source" -type: docs +title: "Looker" weight: 1 -description: > - Looker is a business intelligence tool that also provides a semantic layer. -no_list: true --- - -## About - -[Looker][looker-docs] is a web based business intelligence and data management -tool that provides a semantic layer to facilitate querying. It can be deployed -in the cloud, on GCP, or on premises. - -[looker-docs]: https://cloud.google.com/looker/docs - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Looker User - -This source only uses API authentication. You will need to -[create an API user][looker-user] to login to Looker. - -[looker-user]: - https://cloud.google.com/looker/docs/api-auth#authentication_with_an_sdk - -{{< notice note >}} -To use the Conversational Analytics API, you will need to have the following -Google Cloud Project API enabled and IAM permissions. -{{< /notice >}} - -### API Enablement in GCP - -Enable the following APIs in your Google Cloud Project: - -``` -gcloud services enable geminidataanalytics.googleapis.com --project=$PROJECT_ID -gcloud services enable cloudaicompanion.googleapis.com --project=$PROJECT_ID -``` - -### IAM Permissions in GCP - -In addition to [setting the ADC for your server][set-adc], you need to ensure -the IAM identity has been given the following IAM roles (or corresponding -permissions): - -- `roles/looker.instanceUser` -- `roles/cloudaicompanion.user` -- `roles/geminidataanalytics.dataAgentStatelessUser` - -To initialize the application default credential run `gcloud auth login ---update-adc` in your environment before starting MCP Toolbox. - -[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc - -## Example - -```yaml -kind: sources -name: my-looker-source -type: looker -base_url: http://looker.example.com -client_id: ${LOOKER_CLIENT_ID} -client_secret: ${LOOKER_CLIENT_SECRET} -project: ${LOOKER_PROJECT} -location: ${LOOKER_LOCATION} -verify_ssl: true -timeout: 600s -``` - -The Looker base url will look like "https://looker.example.com", don't include -a trailing "/". In some cases, especially if your Looker is deployed -on-premises, you may need to add the API port number like -"https://looker.example.com:19999". - -Verify ssl should almost always be "true" (all lower case) unless you are using -a self-signed ssl certificate for the Looker server. Anything other than "true" -will be interpreted as false. - -The client id and client secret are seemingly random character sequences -assigned by the looker server. If you are using Looker OAuth you don't need -these settings - -The `project` and `location` fields are utilized **only** when using the -conversational analytics tool. - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - - -## Reference - -| **field** | **type** | **required** | **description** | -|----------------------|:--------:|:------------:|-----------------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "looker". | -| base_url | string | true | The URL of your Looker server with no trailing /. | -| client_id | string | false | The client id assigned by Looker. | -| client_secret | string | false | The client secret assigned by Looker. | -| verify_ssl | string | false | Whether to check the ssl certificate of the server. | -| project | string | false | The project id to use in Google Cloud. | -| location | string | false | The location to use in Google Cloud. (default: us) | -| timeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, 120s is applied. | -| use_client_oauth | string | false | Use OAuth tokens instead of client_id and client_secret. (default: false) If a header name is provided, it will be used instead of "Authorization". | -| show_hidden_models | string | false | Show or hide hidden models. (default: true) | -| show_hidden_explores | string | false | Show or hide hidden explores. (default: true) | -| show_hidden_fields | string | false | Show or hide hidden fields. (default: true) | \ No newline at end of file diff --git a/docs/en/integrations/looker/samples/_index.md b/docs/en/integrations/looker/samples/_index.md new file mode 100644 index 000000000000..e9548b273e4a --- /dev/null +++ b/docs/en/integrations/looker/samples/_index.md @@ -0,0 +1,4 @@ +--- +title: "Samples" +weight: 3 +--- diff --git a/docs/en/build-with-mcp-toolbox/looker/looker_gemini.md b/docs/en/integrations/looker/samples/looker_gemini.md similarity index 95% rename from docs/en/build-with-mcp-toolbox/looker/looker_gemini.md rename to docs/en/integrations/looker/samples/looker_gemini.md index b65167129924..029b33f2ccf4 100644 --- a/docs/en/build-with-mcp-toolbox/looker/looker_gemini.md +++ b/docs/en/integrations/looker/samples/looker_gemini.md @@ -4,13 +4,15 @@ type: docs weight: 2 description: > How to get started running Toolbox with Gemini-CLI and Looker as the source. +sample_filters: ["Gemini CLI", "Looker"] +is_sample: true --- ## Overview [Model Context Protocol](https://modelcontextprotocol.io) is an open protocol that standardizes how applications provide context to LLMs. Check out this page -on how to [connect to Toolbox via MCP](../../user-guide/connect-to/mcp-client/_index.md). +on how to [connect to Toolbox via MCP](../../../documentation/connect-to/mcp-client/_index.md). ## Step 1: Get a Looker Client ID and Client Secret diff --git a/docs/en/build-with-mcp-toolbox/looker/looker_gemini_oauth/_index.md b/docs/en/integrations/looker/samples/looker_gemini_oauth/_index.md similarity index 98% rename from docs/en/build-with-mcp-toolbox/looker/looker_gemini_oauth/_index.md rename to docs/en/integrations/looker/samples/looker_gemini_oauth/_index.md index f8d09c391f12..e8048cf1afe2 100644 --- a/docs/en/build-with-mcp-toolbox/looker/looker_gemini_oauth/_index.md +++ b/docs/en/integrations/looker/samples/looker_gemini_oauth/_index.md @@ -4,6 +4,8 @@ type: docs weight: 2 description: > How to connect to Looker from Gemini-CLI with end-user credentials +sample_filters: ["Gemini CLI", "Looker", "OAuth"] +is_sample: true --- ## Overview diff --git a/docs/en/build-with-mcp-toolbox/looker/looker_gemini_oauth/authenticated.png b/docs/en/integrations/looker/samples/looker_gemini_oauth/authenticated.png similarity index 100% rename from docs/en/build-with-mcp-toolbox/looker/looker_gemini_oauth/authenticated.png rename to docs/en/integrations/looker/samples/looker_gemini_oauth/authenticated.png diff --git a/docs/en/build-with-mcp-toolbox/looker/looker_gemini_oauth/authorize.png b/docs/en/integrations/looker/samples/looker_gemini_oauth/authorize.png similarity index 100% rename from docs/en/build-with-mcp-toolbox/looker/looker_gemini_oauth/authorize.png rename to docs/en/integrations/looker/samples/looker_gemini_oauth/authorize.png diff --git a/docs/en/build-with-mcp-toolbox/looker/looker_gemini_oauth/registration.png b/docs/en/integrations/looker/samples/looker_gemini_oauth/registration.png similarity index 100% rename from docs/en/build-with-mcp-toolbox/looker/looker_gemini_oauth/registration.png rename to docs/en/integrations/looker/samples/looker_gemini_oauth/registration.png diff --git a/docs/en/build-with-mcp-toolbox/looker/looker_mcp_inspector/_index.md b/docs/en/integrations/looker/samples/looker_mcp_inspector/_index.md similarity index 94% rename from docs/en/build-with-mcp-toolbox/looker/looker_mcp_inspector/_index.md rename to docs/en/integrations/looker/samples/looker_mcp_inspector/_index.md index c1c9f7fd4eb4..d07d338d7cea 100644 --- a/docs/en/build-with-mcp-toolbox/looker/looker_mcp_inspector/_index.md +++ b/docs/en/integrations/looker/samples/looker_mcp_inspector/_index.md @@ -4,13 +4,15 @@ type: docs weight: 2 description: > How to get started running Toolbox with MCP Inspector and Looker as the source. +sample_filters: ["Looker", "MCP Inspector"] +is_sample: true --- ## Overview [Model Context Protocol](https://modelcontextprotocol.io) is an open protocol that standardizes how applications provide context to LLMs. Check out this page -on how to [connect to Toolbox via MCP](../../../user-guide/connect-to/mcp-client/_index.md). +on how to [connect to Toolbox via MCP](../../../../documentation/connect-to/mcp-client/_index.md). ## Step 1: Get a Looker Client ID and Client Secret diff --git a/docs/en/build-with-mcp-toolbox/looker/looker_mcp_inspector/inspector.png b/docs/en/integrations/looker/samples/looker_mcp_inspector/inspector.png similarity index 100% rename from docs/en/build-with-mcp-toolbox/looker/looker_mcp_inspector/inspector.png rename to docs/en/integrations/looker/samples/looker_mcp_inspector/inspector.png diff --git a/docs/en/build-with-mcp-toolbox/mcp_quickstart/inspector_tools.png b/docs/en/integrations/looker/samples/looker_mcp_inspector/inspector_tools.png similarity index 100% rename from docs/en/build-with-mcp-toolbox/mcp_quickstart/inspector_tools.png rename to docs/en/integrations/looker/samples/looker_mcp_inspector/inspector_tools.png diff --git a/docs/en/integrations/looker/source.md b/docs/en/integrations/looker/source.md new file mode 100644 index 000000000000..163f68ba259c --- /dev/null +++ b/docs/en/integrations/looker/source.md @@ -0,0 +1,114 @@ +--- +title: "Looker" +weight: 1 +description: > + Looker is a business intelligence tool that also provides a semantic layer. +no_list: true +--- + +## About + +[Looker][looker-docs] is a web based business intelligence and data management +tool that provides a semantic layer to facilitate querying. It can be deployed +in the cloud, on GCP, or on premises. + +[looker-docs]: https://cloud.google.com/looker/docs + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Looker User + +This source only uses API authentication. You will need to +[create an API user][looker-user] to login to Looker. + +[looker-user]: + https://cloud.google.com/looker/docs/api-auth#authentication_with_an_sdk + +{{< notice note >}} +To use the Conversational Analytics API, you will need to have the following +Google Cloud Project API enabled and IAM permissions. +{{< /notice >}} + +### API Enablement in GCP + +Enable the following APIs in your Google Cloud Project: + +``` +gcloud services enable geminidataanalytics.googleapis.com --project=$PROJECT_ID +gcloud services enable cloudaicompanion.googleapis.com --project=$PROJECT_ID +``` + +### IAM Permissions in GCP + +In addition to [setting the ADC for your server][set-adc], you need to ensure +the IAM identity has been given the following IAM roles (or corresponding +permissions): + +- `roles/looker.instanceUser` +- `roles/cloudaicompanion.user` +- `roles/geminidataanalytics.dataAgentStatelessUser` + +To initialize the application default credential run `gcloud auth login +--update-adc` in your environment before starting MCP Toolbox. + +[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc + +## Example + +```yaml +kind: sources +name: my-looker-source +type: looker +base_url: http://looker.example.com +client_id: ${LOOKER_CLIENT_ID} +client_secret: ${LOOKER_CLIENT_SECRET} +project: ${LOOKER_PROJECT} +location: ${LOOKER_LOCATION} +verify_ssl: true +timeout: 600s +``` + +The Looker base url will look like "https://looker.example.com", don't include +a trailing "/". In some cases, especially if your Looker is deployed +on-premises, you may need to add the API port number like +"https://looker.example.com:19999". + +Verify ssl should almost always be "true" (all lower case) unless you are using +a self-signed ssl certificate for the Looker server. Anything other than "true" +will be interpreted as false. + +The client id and client secret are seemingly random character sequences +assigned by the looker server. If you are using Looker OAuth you don't need +these settings + +The `project` and `location` fields are utilized **only** when using the +conversational analytics tool. + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + + +## Reference + +| **field** | **type** | **required** | **description** | +|----------------------|:--------:|:------------:|-----------------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "looker". | +| base_url | string | true | The URL of your Looker server with no trailing /. | +| client_id | string | false | The client id assigned by Looker. | +| client_secret | string | false | The client secret assigned by Looker. | +| verify_ssl | string | false | Whether to check the ssl certificate of the server. | +| project | string | false | The project id to use in Google Cloud. | +| location | string | false | The location to use in Google Cloud. (default: us) | +| timeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, 120s is applied. | +| use_client_oauth | string | false | Use OAuth tokens instead of client_id and client_secret. (default: false) If a header name is provided, it will be used instead of "Authorization". | +| show_hidden_models | string | false | Show or hide hidden models. (default: true) | +| show_hidden_explores | string | false | Show or hide hidden explores. (default: true) | +| show_hidden_fields | string | false | Show or hide hidden fields. (default: true) | diff --git a/docs/en/integrations/looker/tools/_index.md b/docs/en/integrations/looker/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/looker/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/looker/looker-add-dashboard-element.md b/docs/en/integrations/looker/tools/looker-add-dashboard-element.md similarity index 98% rename from docs/en/integrations/looker/looker-add-dashboard-element.md rename to docs/en/integrations/looker/tools/looker-add-dashboard-element.md index 7dcf1d720817..232f3d14a3b1 100644 --- a/docs/en/integrations/looker/looker-add-dashboard-element.md +++ b/docs/en/integrations/looker/tools/looker-add-dashboard-element.md @@ -1,5 +1,5 @@ --- -title: "looker-add-dashboard-element Tool" +title: "looker-add-dashboard-element" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-add-dashboard-filter.md b/docs/en/integrations/looker/tools/looker-add-dashboard-filter.md similarity index 99% rename from docs/en/integrations/looker/looker-add-dashboard-filter.md rename to docs/en/integrations/looker/tools/looker-add-dashboard-filter.md index b61c5c9bf44f..5b9b4cc53d2e 100644 --- a/docs/en/integrations/looker/looker-add-dashboard-filter.md +++ b/docs/en/integrations/looker/tools/looker-add-dashboard-filter.md @@ -1,5 +1,5 @@ --- -title: "looker-add-dashboard-filter Tool" +title: "looker-add-dashboard-filter" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-conversational-analytics.md b/docs/en/integrations/looker/tools/looker-conversational-analytics.md similarity index 97% rename from docs/en/integrations/looker/looker-conversational-analytics.md rename to docs/en/integrations/looker/tools/looker-conversational-analytics.md index e29f998cbd5f..0f5add05bdc1 100644 --- a/docs/en/integrations/looker/looker-conversational-analytics.md +++ b/docs/en/integrations/looker/tools/looker-conversational-analytics.md @@ -1,5 +1,5 @@ --- -title: "looker-conversational-analytics Tool" +title: "looker-conversational-analytics" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-create-project-directory.md b/docs/en/integrations/looker/tools/looker-create-project-directory.md similarity index 96% rename from docs/en/integrations/looker/looker-create-project-directory.md rename to docs/en/integrations/looker/tools/looker-create-project-directory.md index 3767929a89d0..1307af5b6183 100644 --- a/docs/en/integrations/looker/looker-create-project-directory.md +++ b/docs/en/integrations/looker/tools/looker-create-project-directory.md @@ -1,5 +1,5 @@ --- -title: "looker-create-project-directory Tool" +title: "looker-create-project-directory" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-create-project-file.md b/docs/en/integrations/looker/tools/looker-create-project-file.md similarity index 97% rename from docs/en/integrations/looker/looker-create-project-file.md rename to docs/en/integrations/looker/tools/looker-create-project-file.md index 513263c8e44e..0c5801525277 100644 --- a/docs/en/integrations/looker/looker-create-project-file.md +++ b/docs/en/integrations/looker/tools/looker-create-project-file.md @@ -1,5 +1,5 @@ --- -title: "looker-create-project-file Tool" +title: "looker-create-project-file" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-delete-project-directory.md b/docs/en/integrations/looker/tools/looker-delete-project-directory.md similarity index 96% rename from docs/en/integrations/looker/looker-delete-project-directory.md rename to docs/en/integrations/looker/tools/looker-delete-project-directory.md index e0610813cdfd..9490de476a5a 100644 --- a/docs/en/integrations/looker/looker-delete-project-directory.md +++ b/docs/en/integrations/looker/tools/looker-delete-project-directory.md @@ -1,5 +1,5 @@ --- -title: "looker-delete-project-directory Tool" +title: "looker-delete-project-directory" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-delete-project-file.md b/docs/en/integrations/looker/tools/looker-delete-project-file.md similarity index 97% rename from docs/en/integrations/looker/looker-delete-project-file.md rename to docs/en/integrations/looker/tools/looker-delete-project-file.md index 6e4424a09fa6..b9644b213087 100644 --- a/docs/en/integrations/looker/looker-delete-project-file.md +++ b/docs/en/integrations/looker/tools/looker-delete-project-file.md @@ -1,5 +1,5 @@ --- -title: "looker-delete-project-file Tool" +title: "looker-delete-project-file" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-dev-mode.md b/docs/en/integrations/looker/tools/looker-dev-mode.md similarity index 97% rename from docs/en/integrations/looker/looker-dev-mode.md rename to docs/en/integrations/looker/tools/looker-dev-mode.md index 7f4216ae7ece..676489b6745c 100644 --- a/docs/en/integrations/looker/looker-dev-mode.md +++ b/docs/en/integrations/looker/tools/looker-dev-mode.md @@ -1,5 +1,5 @@ --- -title: "looker-dev-mode Tool" +title: "looker-dev-mode" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-generate-embed-url.md b/docs/en/integrations/looker/tools/looker-generate-embed-url.md similarity index 97% rename from docs/en/integrations/looker/looker-generate-embed-url.md rename to docs/en/integrations/looker/tools/looker-generate-embed-url.md index eae5e7e82fbe..553bdf0a79be 100644 --- a/docs/en/integrations/looker/looker-generate-embed-url.md +++ b/docs/en/integrations/looker/tools/looker-generate-embed-url.md @@ -1,5 +1,5 @@ --- -title: "looker-generate-embed-url Tool" +title: "looker-generate-embed-url" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-connection-databases.md b/docs/en/integrations/looker/tools/looker-get-connection-databases.md similarity index 97% rename from docs/en/integrations/looker/looker-get-connection-databases.md rename to docs/en/integrations/looker/tools/looker-get-connection-databases.md index 4695bab942db..f56906e8b352 100644 --- a/docs/en/integrations/looker/looker-get-connection-databases.md +++ b/docs/en/integrations/looker/tools/looker-get-connection-databases.md @@ -1,5 +1,5 @@ --- -title: "looker-get-connection-databases Tool" +title: "looker-get-connection-databases" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-connection-schemas.md b/docs/en/integrations/looker/tools/looker-get-connection-schemas.md similarity index 97% rename from docs/en/integrations/looker/looker-get-connection-schemas.md rename to docs/en/integrations/looker/tools/looker-get-connection-schemas.md index 9fe0e269befe..bec6bfdc0ff2 100644 --- a/docs/en/integrations/looker/looker-get-connection-schemas.md +++ b/docs/en/integrations/looker/tools/looker-get-connection-schemas.md @@ -1,5 +1,5 @@ --- -title: "looker-get-connection-schemas Tool" +title: "looker-get-connection-schemas" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-connection-table-columns.md b/docs/en/integrations/looker/tools/looker-get-connection-table-columns.md similarity index 97% rename from docs/en/integrations/looker/looker-get-connection-table-columns.md rename to docs/en/integrations/looker/tools/looker-get-connection-table-columns.md index 3cdfd4fedf34..a266d38d182d 100644 --- a/docs/en/integrations/looker/looker-get-connection-table-columns.md +++ b/docs/en/integrations/looker/tools/looker-get-connection-table-columns.md @@ -1,5 +1,5 @@ --- -title: "looker-get-connection-table-columns Tool" +title: "looker-get-connection-table-columns" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-connection-tables.md b/docs/en/integrations/looker/tools/looker-get-connection-tables.md similarity index 97% rename from docs/en/integrations/looker/looker-get-connection-tables.md rename to docs/en/integrations/looker/tools/looker-get-connection-tables.md index cb2875da3cc5..592e211be8f5 100644 --- a/docs/en/integrations/looker/looker-get-connection-tables.md +++ b/docs/en/integrations/looker/tools/looker-get-connection-tables.md @@ -1,5 +1,5 @@ --- -title: "looker-get-connection-tables Tool" +title: "looker-get-connection-tables" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-connections.md b/docs/en/integrations/looker/tools/looker-get-connections.md similarity index 97% rename from docs/en/integrations/looker/looker-get-connections.md rename to docs/en/integrations/looker/tools/looker-get-connections.md index ab10b99e7ab9..2a4ea77cecc1 100644 --- a/docs/en/integrations/looker/looker-get-connections.md +++ b/docs/en/integrations/looker/tools/looker-get-connections.md @@ -1,5 +1,5 @@ --- -title: "looker-get-connections Tool" +title: "looker-get-connections" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-dashboards.md b/docs/en/integrations/looker/tools/looker-get-dashboards.md similarity index 98% rename from docs/en/integrations/looker/looker-get-dashboards.md rename to docs/en/integrations/looker/tools/looker-get-dashboards.md index 33ea02030d3c..c9be2b4ed0fa 100644 --- a/docs/en/integrations/looker/looker-get-dashboards.md +++ b/docs/en/integrations/looker/tools/looker-get-dashboards.md @@ -1,5 +1,5 @@ --- -title: "looker-get-dashboards Tool" +title: "looker-get-dashboards" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-dimensions.md b/docs/en/integrations/looker/tools/looker-get-dimensions.md similarity index 98% rename from docs/en/integrations/looker/looker-get-dimensions.md rename to docs/en/integrations/looker/tools/looker-get-dimensions.md index e24d9edc2515..ba94de673a0f 100644 --- a/docs/en/integrations/looker/looker-get-dimensions.md +++ b/docs/en/integrations/looker/tools/looker-get-dimensions.md @@ -1,5 +1,5 @@ --- -title: "looker-get-dimensions Tool" +title: "looker-get-dimensions" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-explores.md b/docs/en/integrations/looker/tools/looker-get-explores.md similarity index 97% rename from docs/en/integrations/looker/looker-get-explores.md rename to docs/en/integrations/looker/tools/looker-get-explores.md index 2f90adc28cf2..c6b8cf6d1830 100644 --- a/docs/en/integrations/looker/looker-get-explores.md +++ b/docs/en/integrations/looker/tools/looker-get-explores.md @@ -1,5 +1,5 @@ --- -title: "looker-get-explores Tool" +title: "looker-get-explores" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-filters.md b/docs/en/integrations/looker/tools/looker-get-filters.md similarity index 98% rename from docs/en/integrations/looker/looker-get-filters.md rename to docs/en/integrations/looker/tools/looker-get-filters.md index b8c9374dbf24..120fc1d2c722 100644 --- a/docs/en/integrations/looker/looker-get-filters.md +++ b/docs/en/integrations/looker/tools/looker-get-filters.md @@ -1,5 +1,5 @@ --- -title: "looker-get-filters Tool" +title: "looker-get-filters" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-looks.md b/docs/en/integrations/looker/tools/looker-get-looks.md similarity index 98% rename from docs/en/integrations/looker/looker-get-looks.md rename to docs/en/integrations/looker/tools/looker-get-looks.md index 12889935768e..a97b2693c3f7 100644 --- a/docs/en/integrations/looker/looker-get-looks.md +++ b/docs/en/integrations/looker/tools/looker-get-looks.md @@ -1,5 +1,5 @@ --- -title: "looker-get-looks Tool" +title: "looker-get-looks" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-measures.md b/docs/en/integrations/looker/tools/looker-get-measures.md similarity index 98% rename from docs/en/integrations/looker/looker-get-measures.md rename to docs/en/integrations/looker/tools/looker-get-measures.md index 99cd225fd2c0..58cb5c58f71d 100644 --- a/docs/en/integrations/looker/looker-get-measures.md +++ b/docs/en/integrations/looker/tools/looker-get-measures.md @@ -1,5 +1,5 @@ --- -title: "looker-get-measures Tool" +title: "looker-get-measures" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-models.md b/docs/en/integrations/looker/tools/looker-get-models.md similarity index 97% rename from docs/en/integrations/looker/looker-get-models.md rename to docs/en/integrations/looker/tools/looker-get-models.md index 6f82abc2a773..d23a857aa61a 100644 --- a/docs/en/integrations/looker/looker-get-models.md +++ b/docs/en/integrations/looker/tools/looker-get-models.md @@ -1,5 +1,5 @@ --- -title: "looker-get-models Tool" +title: "looker-get-models" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-parameters.md b/docs/en/integrations/looker/tools/looker-get-parameters.md similarity index 98% rename from docs/en/integrations/looker/looker-get-parameters.md rename to docs/en/integrations/looker/tools/looker-get-parameters.md index 70d086702c24..9e609c3226f7 100644 --- a/docs/en/integrations/looker/looker-get-parameters.md +++ b/docs/en/integrations/looker/tools/looker-get-parameters.md @@ -1,5 +1,5 @@ --- -title: "looker-get-parameters Tool" +title: "looker-get-parameters" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-project-directories.md b/docs/en/integrations/looker/tools/looker-get-project-directories.md similarity index 96% rename from docs/en/integrations/looker/looker-get-project-directories.md rename to docs/en/integrations/looker/tools/looker-get-project-directories.md index 5449f25163dc..50089da0a9e1 100644 --- a/docs/en/integrations/looker/looker-get-project-directories.md +++ b/docs/en/integrations/looker/tools/looker-get-project-directories.md @@ -1,5 +1,5 @@ --- -title: "looker-get-project-directories Tool" +title: "looker-get-project-directories" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-project-file.md b/docs/en/integrations/looker/tools/looker-get-project-file.md similarity index 97% rename from docs/en/integrations/looker/looker-get-project-file.md rename to docs/en/integrations/looker/tools/looker-get-project-file.md index 86e1bc817bea..fe68fb0f2b2d 100644 --- a/docs/en/integrations/looker/looker-get-project-file.md +++ b/docs/en/integrations/looker/tools/looker-get-project-file.md @@ -1,5 +1,5 @@ --- -title: "looker-get-project-file Tool" +title: "looker-get-project-file" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-project-files.md b/docs/en/integrations/looker/tools/looker-get-project-files.md similarity index 97% rename from docs/en/integrations/looker/looker-get-project-files.md rename to docs/en/integrations/looker/tools/looker-get-project-files.md index 0678cd22d150..5ce1812e655f 100644 --- a/docs/en/integrations/looker/looker-get-project-files.md +++ b/docs/en/integrations/looker/tools/looker-get-project-files.md @@ -1,5 +1,5 @@ --- -title: "looker-get-project-files Tool" +title: "looker-get-project-files" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-get-projects.md b/docs/en/integrations/looker/tools/looker-get-projects.md similarity index 97% rename from docs/en/integrations/looker/looker-get-projects.md rename to docs/en/integrations/looker/tools/looker-get-projects.md index ff82e8aedec2..d2cb7a6ea4c8 100644 --- a/docs/en/integrations/looker/looker-get-projects.md +++ b/docs/en/integrations/looker/tools/looker-get-projects.md @@ -1,5 +1,5 @@ --- -title: "looker-get-projects Tool" +title: "looker-get-projects" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-health-analyze.md b/docs/en/integrations/looker/tools/looker-health-analyze.md similarity index 98% rename from docs/en/integrations/looker/looker-health-analyze.md rename to docs/en/integrations/looker/tools/looker-health-analyze.md index d2d8a494cd46..c045e8ab0439 100644 --- a/docs/en/integrations/looker/looker-health-analyze.md +++ b/docs/en/integrations/looker/tools/looker-health-analyze.md @@ -1,5 +1,5 @@ --- -title: "looker-health-analyze Tool" +title: "looker-health-analyze" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-health-pulse.md b/docs/en/integrations/looker/tools/looker-health-pulse.md similarity index 99% rename from docs/en/integrations/looker/looker-health-pulse.md rename to docs/en/integrations/looker/tools/looker-health-pulse.md index e8c9249455e9..97474e3eb282 100644 --- a/docs/en/integrations/looker/looker-health-pulse.md +++ b/docs/en/integrations/looker/tools/looker-health-pulse.md @@ -1,5 +1,5 @@ --- -title: "looker-health-pulse Tool" +title: "looker-health-pulse" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-health-vacuum.md b/docs/en/integrations/looker/tools/looker-health-vacuum.md similarity index 98% rename from docs/en/integrations/looker/looker-health-vacuum.md rename to docs/en/integrations/looker/tools/looker-health-vacuum.md index a692bb48aa5f..5b4b73b58b8f 100644 --- a/docs/en/integrations/looker/looker-health-vacuum.md +++ b/docs/en/integrations/looker/tools/looker-health-vacuum.md @@ -1,5 +1,5 @@ --- -title: "looker-health-vacuum Tool" +title: "looker-health-vacuum" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-make-dashboard.md b/docs/en/integrations/looker/tools/looker-make-dashboard.md similarity index 97% rename from docs/en/integrations/looker/looker-make-dashboard.md rename to docs/en/integrations/looker/tools/looker-make-dashboard.md index 17298aa7c8c2..7b804860968a 100644 --- a/docs/en/integrations/looker/looker-make-dashboard.md +++ b/docs/en/integrations/looker/tools/looker-make-dashboard.md @@ -1,5 +1,5 @@ --- -title: "looker-make-dashboard Tool" +title: "looker-make-dashboard" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-make-look.md b/docs/en/integrations/looker/tools/looker-make-look.md similarity index 98% rename from docs/en/integrations/looker/looker-make-look.md rename to docs/en/integrations/looker/tools/looker-make-look.md index 75858d8b8484..63b123714469 100644 --- a/docs/en/integrations/looker/looker-make-look.md +++ b/docs/en/integrations/looker/tools/looker-make-look.md @@ -1,5 +1,5 @@ --- -title: "looker-make-look Tool" +title: "looker-make-look" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-query-sql.md b/docs/en/integrations/looker/tools/looker-query-sql.md similarity index 98% rename from docs/en/integrations/looker/looker-query-sql.md rename to docs/en/integrations/looker/tools/looker-query-sql.md index 01a2bd262adb..9244324e3474 100644 --- a/docs/en/integrations/looker/looker-query-sql.md +++ b/docs/en/integrations/looker/tools/looker-query-sql.md @@ -1,5 +1,5 @@ --- -title: "looker-query-sql Tool" +title: "looker-query-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-query-url.md b/docs/en/integrations/looker/tools/looker-query-url.md similarity index 99% rename from docs/en/integrations/looker/looker-query-url.md rename to docs/en/integrations/looker/tools/looker-query-url.md index fb9c6f1835d8..df565e191685 100644 --- a/docs/en/integrations/looker/looker-query-url.md +++ b/docs/en/integrations/looker/tools/looker-query-url.md @@ -1,5 +1,5 @@ --- -title: "looker-query-url Tool" +title: "looker-query-url" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-query.md b/docs/en/integrations/looker/tools/looker-query.md similarity index 98% rename from docs/en/integrations/looker/looker-query.md rename to docs/en/integrations/looker/tools/looker-query.md index f2c53960751f..b8326ec5e338 100644 --- a/docs/en/integrations/looker/looker-query.md +++ b/docs/en/integrations/looker/tools/looker-query.md @@ -1,5 +1,5 @@ --- -title: "looker-query Tool" +title: "looker-query" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-run-dashboard.md b/docs/en/integrations/looker/tools/looker-run-dashboard.md similarity index 97% rename from docs/en/integrations/looker/looker-run-dashboard.md rename to docs/en/integrations/looker/tools/looker-run-dashboard.md index 93cc1ece6e17..041cb738ab95 100644 --- a/docs/en/integrations/looker/looker-run-dashboard.md +++ b/docs/en/integrations/looker/tools/looker-run-dashboard.md @@ -1,5 +1,5 @@ --- -title: "looker-run-dashboard Tool" +title: "looker-run-dashboard" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-run-look.md b/docs/en/integrations/looker/tools/looker-run-look.md similarity index 97% rename from docs/en/integrations/looker/looker-run-look.md rename to docs/en/integrations/looker/tools/looker-run-look.md index 2afaadca835e..b9a3289ca8eb 100644 --- a/docs/en/integrations/looker/looker-run-look.md +++ b/docs/en/integrations/looker/tools/looker-run-look.md @@ -1,5 +1,5 @@ --- -title: "looker-run-look Tool" +title: "looker-run-look" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-update-project-file.md b/docs/en/integrations/looker/tools/looker-update-project-file.md similarity index 97% rename from docs/en/integrations/looker/looker-update-project-file.md rename to docs/en/integrations/looker/tools/looker-update-project-file.md index 4868e4443f4a..e90f690c31ad 100644 --- a/docs/en/integrations/looker/looker-update-project-file.md +++ b/docs/en/integrations/looker/tools/looker-update-project-file.md @@ -1,5 +1,5 @@ --- -title: "looker-update-project-file Tool" +title: "looker-update-project-file" type: docs weight: 1 description: > diff --git a/docs/en/integrations/looker/looker-validate-project.md b/docs/en/integrations/looker/tools/looker-validate-project.md similarity index 97% rename from docs/en/integrations/looker/looker-validate-project.md rename to docs/en/integrations/looker/tools/looker-validate-project.md index b4bc8db046bd..dd8bd49549e5 100644 --- a/docs/en/integrations/looker/looker-validate-project.md +++ b/docs/en/integrations/looker/tools/looker-validate-project.md @@ -1,5 +1,5 @@ --- -title: "looker-validate-project Tool" +title: "looker-validate-project" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mariadb/_index.md b/docs/en/integrations/mariadb/_index.md index 860067a236f5..9288359c4ace 100644 --- a/docs/en/integrations/mariadb/_index.md +++ b/docs/en/integrations/mariadb/_index.md @@ -1,63 +1,4 @@ --- -title: "MariaDB Source" -type: docs +title: "MariaDB" weight: 1 -description: > - MariaDB is an open-source relational database compatible with MySQL. -no_list: true ---- -## About - -MariaDB is a relational database management system derived from MySQL. It -implements the MySQL protocol and client libraries and supports modern SQL -features with a focus on performance and reliability. - -**Note**: MariaDB is supported using the MySQL source. - -## Available Tools - -{{< list-tools dirs="/integrations/mysql" >}} - -## Requirements - -### Database User - -This source only uses standard authentication. You will need to [create a -MariaDB user][mariadb-users] to log in to the database. - -[mariadb-users]: https://mariadb.com/kb/en/create-user/ - -## Example - -```yaml -kind: sources -name: my_mariadb_db -type: mysql -host: 127.0.0.1 -port: 3306 -database: my_db -user: ${MARIADB_USER} -password: ${MARIADB_PASS} -# Optional TLS and other driver parameters. For example, enable preferred TLS: -# queryParams: -# tls: preferred -queryTimeout: 30s # Optional: query timeout duration -``` - -{{< notice tip >}} -Use environment variables instead of committing credentials to source files. -{{< /notice >}} - - -## Reference - -| **field** | **type** | **required** | **description** | -| ------------ | :------: | :----------: | ----------------------------------------------------------------------------------------------- | -| type | string | true | Must be `mysql`. | -| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | -| port | string | true | Port to connect to (e.g. "3307"). | -| database | string | true | Name of the MariaDB database to connect to (e.g. "my_db"). | -| user | string | true | Name of the MariaDB user to connect as (e.g. "my-mysql-user"). | -| password | string | true | Password of the MariaDB user (e.g. "my-password"). | -| queryTimeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, no timeout is applied. | -| queryParams | map | false | Arbitrary DSN parameters passed to the driver (e.g. `tls: preferred`, `charset: utf8mb4`). Useful for enabling TLS or other connection options. | +--- \ No newline at end of file diff --git a/docs/en/integrations/mariadb/source.md b/docs/en/integrations/mariadb/source.md new file mode 100644 index 000000000000..e20f98f83045 --- /dev/null +++ b/docs/en/integrations/mariadb/source.md @@ -0,0 +1,64 @@ +--- +title: "MariaDB Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + MariaDB is an open-source relational database compatible with MySQL. +no_list: true +--- +## About + +MariaDB is a relational database management system derived from MySQL. It +implements the MySQL protocol and client libraries and supports modern SQL +features with a focus on performance and reliability. + +**Note**: MariaDB is supported using the MySQL source. + +## Available Tools + +{{< list-tools dirs="/integrations/mysql/tools" >}} + +## Requirements + +### Database User + +This source only uses standard authentication. You will need to [create a +MariaDB user][mariadb-users] to log in to the database. + +[mariadb-users]: https://mariadb.com/kb/en/create-user/ + +## Example + +```yaml +kind: sources +name: my_mariadb_db +type: mysql +host: 127.0.0.1 +port: 3306 +database: my_db +user: ${MARIADB_USER} +password: ${MARIADB_PASS} +# Optional TLS and other driver parameters. For example, enable preferred TLS: +# queryParams: +# tls: preferred +queryTimeout: 30s # Optional: query timeout duration +``` + +{{< notice tip >}} +Use environment variables instead of committing credentials to source files. +{{< /notice >}} + + +## Reference + +| **field** | **type** | **required** | **description** | +| ------------ | :------: | :----------: | ----------------------------------------------------------------------------------------------- | +| type | string | true | Must be `mysql`. | +| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | +| port | string | true | Port to connect to (e.g. "3307"). | +| database | string | true | Name of the MariaDB database to connect to (e.g. "my_db"). | +| user | string | true | Name of the MariaDB user to connect as (e.g. "my-mysql-user"). | +| password | string | true | Password of the MariaDB user (e.g. "my-password"). | +| queryTimeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, no timeout is applied. | +| queryParams | map | false | Arbitrary DSN parameters passed to the driver (e.g. `tls: preferred`, `charset: utf8mb4`). Useful for enabling TLS or other connection options. | diff --git a/docs/en/integrations/mariadb/tools/_index.md b/docs/en/integrations/mariadb/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/mariadb/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/mariadb/tools/mysql-tools.md b/docs/en/integrations/mariadb/tools/mysql-tools.md new file mode 100644 index 000000000000..df54df8ded7d --- /dev/null +++ b/docs/en/integrations/mariadb/tools/mysql-tools.md @@ -0,0 +1,8 @@ +--- +title: "MySQL Tools" +weight: 90 +type: docs +is_wrapper: true +--- + +{{< list-tools dirs="integrations/mysql/tools" >}} \ No newline at end of file diff --git a/docs/en/integrations/mindsdb/_index.md b/docs/en/integrations/mindsdb/_index.md index 5f9b58477d4b..783736f0b865 100644 --- a/docs/en/integrations/mindsdb/_index.md +++ b/docs/en/integrations/mindsdb/_index.md @@ -1,195 +1,4 @@ --- -title: "MindsDB Source" -type: docs +title: "MindsDB" weight: 1 -description: > - MindsDB is an AI federated database that enables SQL queries across hundreds of datasources and ML models. -no_list: true ---- - -## About - -[MindsDB][mindsdb-docs] is an AI federated database in the world. It allows you -to combine information from hundreds of datasources as if they were SQL, -supporting joins across datasources and enabling you to query all unstructured -data as if it were structured. - -MindsDB translates MySQL queries into whatever API is needed - whether it's REST -APIs, GraphQL, or native database protocols. This means you can write standard -SQL queries and MindsDB automatically handles the translation to APIs like -Salesforce, Jira, GitHub, email systems, MongoDB, and hundreds of other -datasources. - -MindsDB also enables you to use ML frameworks to train and use models as virtual -tables from the data in those datasources. With MindsDB, the GenAI Toolbox can -now expand to hundreds of datasources and leverage all of MindsDB's capabilities -on ML and unstructured data. - -**Key Features:** - -- **Federated Database**: Connect and query hundreds of datasources through a - single SQL interface -- **Cross-Datasource Joins**: Perform joins across different datasources - seamlessly -- **API Translation**: Automatically translates MySQL queries into REST APIs, - GraphQL, and native protocols -- **Unstructured Data Support**: Query unstructured data as if it were - structured -- **ML as Virtual Tables**: Train and use ML models as virtual tables -- **MySQL Wire Protocol**: Compatible with standard MySQL clients and tools - -[mindsdb-docs]: https://docs.mindsdb.com/ -[mindsdb-github]: https://github.com/mindsdb/mindsdb - -### Supported Datasources - -MindsDB supports hundreds of datasources, including: - -#### **Business Applications** - -- **Salesforce**: Query leads, opportunities, accounts, and custom objects -- **Jira**: Access issues, projects, workflows, and team data -- **GitHub**: Query repositories, commits, pull requests, and issues -- **Slack**: Access channels, messages, and team communications -- **HubSpot**: Query contacts, companies, deals, and marketing data - -#### **Databases & Storage** - -- **MongoDB**: Query NoSQL collections as structured tables -- **Redis**: Key-value stores and caching layers -- **Elasticsearch**: Search and analytics data -- **S3/Google Cloud Storage**: File storage and data lakes - -#### **Communication & Email** - -- **Gmail/Outlook**: Query emails, attachments, and metadata -- **Slack**: Access workspace data and conversations -- **Microsoft Teams**: Team communications and files -- **Discord**: Server data and message history - -### Example Queries - -#### Cross-Datasource Analytics - -```sql --- Join Salesforce opportunities with GitHub activity -SELECT - s.opportunity_name, - s.amount, - g.repository_name, - COUNT(g.commits) as commit_count -FROM salesforce.opportunities s -JOIN github.repositories g ON s.account_id = g.owner_id -WHERE s.stage = 'Closed Won' -GROUP BY s.opportunity_name, s.amount, g.repository_name; -``` - -#### Email & Communication Analysis - -```sql --- Analyze email patterns with Slack activity -SELECT - e.sender, - e.subject, - s.channel_name, - COUNT(s.messages) as message_count -FROM gmail.emails e -JOIN slack.messages s ON e.sender = s.user_name -WHERE e.date >= '2024-01-01' -GROUP BY e.sender, e.subject, s.channel_name; -``` - -#### ML Model Predictions - -```sql --- Use ML model to predict customer churn -SELECT - customer_id, - customer_name, - predicted_churn_probability, - recommended_action -FROM customer_churn_model -WHERE predicted_churn_probability > 0.8; -``` - -### Use Cases - -With MindsDB integration, you can: - -- **Query Multiple Datasources**: Connect to databases, APIs, file systems, and - more through a single SQL interface -- **Cross-Datasource Analytics**: Perform joins and analytics across different - data sources -- **ML Model Integration**: Use trained ML models as virtual tables for - predictions and insights -- **Unstructured Data Processing**: Query documents, images, and other - unstructured data as structured tables -- **Real-time Predictions**: Get real-time predictions from ML models through - SQL queries -- **API Abstraction**: Write SQL queries that automatically translate to REST - APIs, GraphQL, and native protocols - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source uses standard MySQL authentication since MindsDB implements the -MySQL wire protocol. You will need to [create a MindsDB user][mindsdb-users] to -login to the database with. If MindsDB is configured without authentication, you -can omit the password field. - -[mindsdb-users]: https://docs.mindsdb.com/ - -## Example - -```yaml -kind: sources -name: my-mindsdb-source -type: mindsdb -host: 127.0.0.1 -port: 3306 -database: my_db -user: ${USER_NAME} -password: ${PASSWORD} # Optional: omit if MindsDB is configured without authentication -queryTimeout: 30s # Optional: query timeout duration -``` - -### Working Configuration Example - -Here's a working configuration that has been tested: - -```yaml -kind: sources -name: my-pg-source -type: mindsdb -host: 127.0.0.1 -port: 47335 -database: files -user: mindsdb -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|--------------|:--------:|:------------:|--------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "mindsdb". | -| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | -| port | string | true | Port to connect to (e.g. "3306"). | -| database | string | true | Name of the MindsDB database to connect to (e.g. "my_db"). | -| user | string | true | Name of the MindsDB user to connect as (e.g. "my-mindsdb-user"). | -| password | string | false | Password of the MindsDB user (e.g. "my-password"). Optional if MindsDB is configured without authentication. | -| queryTimeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, no timeout is applied. | - -## Additional Resources - -- [MindsDB Documentation][mindsdb-docs] - Official documentation and guides -- [MindsDB GitHub][mindsdb-github] - Source code and community +--- \ No newline at end of file diff --git a/docs/en/integrations/mindsdb/source.md b/docs/en/integrations/mindsdb/source.md new file mode 100644 index 000000000000..dbda6cc6ad41 --- /dev/null +++ b/docs/en/integrations/mindsdb/source.md @@ -0,0 +1,196 @@ +--- +title: "MindsDB Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + MindsDB is an AI federated database that enables SQL queries across hundreds of datasources and ML models. +no_list: true +--- + +## About + +[MindsDB][mindsdb-docs] is an AI federated database in the world. It allows you +to combine information from hundreds of datasources as if they were SQL, +supporting joins across datasources and enabling you to query all unstructured +data as if it were structured. + +MindsDB translates MySQL queries into whatever API is needed - whether it's REST +APIs, GraphQL, or native database protocols. This means you can write standard +SQL queries and MindsDB automatically handles the translation to APIs like +Salesforce, Jira, GitHub, email systems, MongoDB, and hundreds of other +datasources. + +MindsDB also enables you to use ML frameworks to train and use models as virtual +tables from the data in those datasources. With MindsDB, the GenAI Toolbox can +now expand to hundreds of datasources and leverage all of MindsDB's capabilities +on ML and unstructured data. + +**Key Features:** + +- **Federated Database**: Connect and query hundreds of datasources through a + single SQL interface +- **Cross-Datasource Joins**: Perform joins across different datasources + seamlessly +- **API Translation**: Automatically translates MySQL queries into REST APIs, + GraphQL, and native protocols +- **Unstructured Data Support**: Query unstructured data as if it were + structured +- **ML as Virtual Tables**: Train and use ML models as virtual tables +- **MySQL Wire Protocol**: Compatible with standard MySQL clients and tools + +[mindsdb-docs]: https://docs.mindsdb.com/ +[mindsdb-github]: https://github.com/mindsdb/mindsdb + +### Supported Datasources + +MindsDB supports hundreds of datasources, including: + +#### **Business Applications** + +- **Salesforce**: Query leads, opportunities, accounts, and custom objects +- **Jira**: Access issues, projects, workflows, and team data +- **GitHub**: Query repositories, commits, pull requests, and issues +- **Slack**: Access channels, messages, and team communications +- **HubSpot**: Query contacts, companies, deals, and marketing data + +#### **Databases & Storage** + +- **MongoDB**: Query NoSQL collections as structured tables +- **Redis**: Key-value stores and caching layers +- **Elasticsearch**: Search and analytics data +- **S3/Google Cloud Storage**: File storage and data lakes + +#### **Communication & Email** + +- **Gmail/Outlook**: Query emails, attachments, and metadata +- **Slack**: Access workspace data and conversations +- **Microsoft Teams**: Team communications and files +- **Discord**: Server data and message history + +### Example Queries + +#### Cross-Datasource Analytics + +```sql +-- Join Salesforce opportunities with GitHub activity +SELECT + s.opportunity_name, + s.amount, + g.repository_name, + COUNT(g.commits) as commit_count +FROM salesforce.opportunities s +JOIN github.repositories g ON s.account_id = g.owner_id +WHERE s.stage = 'Closed Won' +GROUP BY s.opportunity_name, s.amount, g.repository_name; +``` + +#### Email & Communication Analysis + +```sql +-- Analyze email patterns with Slack activity +SELECT + e.sender, + e.subject, + s.channel_name, + COUNT(s.messages) as message_count +FROM gmail.emails e +JOIN slack.messages s ON e.sender = s.user_name +WHERE e.date >= '2024-01-01' +GROUP BY e.sender, e.subject, s.channel_name; +``` + +#### ML Model Predictions + +```sql +-- Use ML model to predict customer churn +SELECT + customer_id, + customer_name, + predicted_churn_probability, + recommended_action +FROM customer_churn_model +WHERE predicted_churn_probability > 0.8; +``` + +### Use Cases + +With MindsDB integration, you can: + +- **Query Multiple Datasources**: Connect to databases, APIs, file systems, and + more through a single SQL interface +- **Cross-Datasource Analytics**: Perform joins and analytics across different + data sources +- **ML Model Integration**: Use trained ML models as virtual tables for + predictions and insights +- **Unstructured Data Processing**: Query documents, images, and other + unstructured data as structured tables +- **Real-time Predictions**: Get real-time predictions from ML models through + SQL queries +- **API Abstraction**: Write SQL queries that automatically translate to REST + APIs, GraphQL, and native protocols + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source uses standard MySQL authentication since MindsDB implements the +MySQL wire protocol. You will need to [create a MindsDB user][mindsdb-users] to +login to the database with. If MindsDB is configured without authentication, you +can omit the password field. + +[mindsdb-users]: https://docs.mindsdb.com/ + +## Example + +```yaml +kind: sources +name: my-mindsdb-source +type: mindsdb +host: 127.0.0.1 +port: 3306 +database: my_db +user: ${USER_NAME} +password: ${PASSWORD} # Optional: omit if MindsDB is configured without authentication +queryTimeout: 30s # Optional: query timeout duration +``` + +### Working Configuration Example + +Here's a working configuration that has been tested: + +```yaml +kind: sources +name: my-pg-source +type: mindsdb +host: 127.0.0.1 +port: 47335 +database: files +user: mindsdb +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|--------------|:--------:|:------------:|--------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "mindsdb". | +| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | +| port | string | true | Port to connect to (e.g. "3306"). | +| database | string | true | Name of the MindsDB database to connect to (e.g. "my_db"). | +| user | string | true | Name of the MindsDB user to connect as (e.g. "my-mindsdb-user"). | +| password | string | false | Password of the MindsDB user (e.g. "my-password"). Optional if MindsDB is configured without authentication. | +| queryTimeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, no timeout is applied. | + +## Additional Resources + +- [MindsDB Documentation][mindsdb-docs] - Official documentation and guides +- [MindsDB GitHub][mindsdb-github] - Source code and community diff --git a/docs/en/integrations/mindsdb/tools/_index.md b/docs/en/integrations/mindsdb/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/mindsdb/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/mindsdb/mindsdb-execute-sql.md b/docs/en/integrations/mindsdb/tools/mindsdb-execute-sql.md similarity index 99% rename from docs/en/integrations/mindsdb/mindsdb-execute-sql.md rename to docs/en/integrations/mindsdb/tools/mindsdb-execute-sql.md index 373a88adc29f..c99adaea2718 100644 --- a/docs/en/integrations/mindsdb/mindsdb-execute-sql.md +++ b/docs/en/integrations/mindsdb/tools/mindsdb-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "mindsdb-execute-sql Tool" +title: "mindsdb-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mindsdb/mindsdb-sql.md b/docs/en/integrations/mindsdb/tools/mindsdb-sql.md similarity index 99% rename from docs/en/integrations/mindsdb/mindsdb-sql.md rename to docs/en/integrations/mindsdb/tools/mindsdb-sql.md index d6c0c1115635..ad997d4c2c37 100644 --- a/docs/en/integrations/mindsdb/mindsdb-sql.md +++ b/docs/en/integrations/mindsdb/tools/mindsdb-sql.md @@ -1,5 +1,5 @@ --- -title: "mindsdb-sql Tool" +title: "mindsdb-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mongodb/_index.md b/docs/en/integrations/mongodb/_index.md index 3283b6c49c0a..a3e6b78a6d32 100644 --- a/docs/en/integrations/mongodb/_index.md +++ b/docs/en/integrations/mongodb/_index.md @@ -1,38 +1,4 @@ --- -title: "MongoDB Source" -type: docs +title: "MongoDB" weight: 1 -description: > - MongoDB is a no-sql data platform that can not only serve general purpose data requirements also perform VectorSearch where both operational data and embeddings used of search can reside in same document. -no_list: true ---- - -## About - -[MongoDB][mongodb-docs] is a popular NoSQL database that stores data in -flexible, JSON-like documents, making it easy to develop and scale applications. - -[mongodb-docs]: https://www.mongodb.com/docs/atlas/getting-started/ - - - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-mongodb -type: mongodb -uri: "mongodb+srv://username:password@host.mongodb.net" - -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|-------------------------------------------------------------------| -| type | string | true | Must be "mongodb". | -| uri | string | true | connection string to connect to MongoDB | +--- \ No newline at end of file diff --git a/docs/en/integrations/mongodb/source.md b/docs/en/integrations/mongodb/source.md new file mode 100644 index 000000000000..5e845b396994 --- /dev/null +++ b/docs/en/integrations/mongodb/source.md @@ -0,0 +1,39 @@ +--- +title: "MongoDB Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + MongoDB is a no-sql data platform that can not only serve general purpose data requirements also perform VectorSearch where both operational data and embeddings used of search can reside in same document. +no_list: true +--- + +## About + +[MongoDB][mongodb-docs] is a popular NoSQL database that stores data in +flexible, JSON-like documents, making it easy to develop and scale applications. + +[mongodb-docs]: https://www.mongodb.com/docs/atlas/getting-started/ + + + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-mongodb +type: mongodb +uri: "mongodb+srv://username:password@host.mongodb.net" + +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|-------------------------------------------------------------------| +| type | string | true | Must be "mongodb". | +| uri | string | true | connection string to connect to MongoDB | diff --git a/docs/en/integrations/mongodb/tools/_index.md b/docs/en/integrations/mongodb/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/mongodb/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/mongodb/mongodb-aggregate.md b/docs/en/integrations/mongodb/tools/mongodb-aggregate.md similarity index 99% rename from docs/en/integrations/mongodb/mongodb-aggregate.md rename to docs/en/integrations/mongodb/tools/mongodb-aggregate.md index 119a4df08917..02af9e496b3e 100644 --- a/docs/en/integrations/mongodb/mongodb-aggregate.md +++ b/docs/en/integrations/mongodb/tools/mongodb-aggregate.md @@ -1,5 +1,5 @@ --- -title: "mongodb-aggregate Tool" +title: "mongodb-aggregate" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mongodb/mongodb-delete-many.md b/docs/en/integrations/mongodb/tools/mongodb-delete-many.md similarity index 98% rename from docs/en/integrations/mongodb/mongodb-delete-many.md rename to docs/en/integrations/mongodb/tools/mongodb-delete-many.md index 4c426cd16b36..c40607de3cf5 100644 --- a/docs/en/integrations/mongodb/mongodb-delete-many.md +++ b/docs/en/integrations/mongodb/tools/mongodb-delete-many.md @@ -1,5 +1,5 @@ --- -title: "mongodb-delete-many Tool" +title: "mongodb-delete-many" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mongodb/mongodb-delete-one.md b/docs/en/integrations/mongodb/tools/mongodb-delete-one.md similarity index 98% rename from docs/en/integrations/mongodb/mongodb-delete-one.md rename to docs/en/integrations/mongodb/tools/mongodb-delete-one.md index 7b3049fe4738..85b1c5819818 100644 --- a/docs/en/integrations/mongodb/mongodb-delete-one.md +++ b/docs/en/integrations/mongodb/tools/mongodb-delete-one.md @@ -1,5 +1,5 @@ --- -title: "mongodb-delete-one Tool" +title: "mongodb-delete-one" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mongodb/mongodb-find-one.md b/docs/en/integrations/mongodb/tools/mongodb-find-one.md similarity index 99% rename from docs/en/integrations/mongodb/mongodb-find-one.md rename to docs/en/integrations/mongodb/tools/mongodb-find-one.md index 13e8f3a3c249..96b3529966a9 100644 --- a/docs/en/integrations/mongodb/mongodb-find-one.md +++ b/docs/en/integrations/mongodb/tools/mongodb-find-one.md @@ -1,5 +1,5 @@ --- -title: "mongodb-find-one Tool" +title: "mongodb-find-one" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mongodb/mongodb-find.md b/docs/en/integrations/mongodb/tools/mongodb-find.md similarity index 99% rename from docs/en/integrations/mongodb/mongodb-find.md rename to docs/en/integrations/mongodb/tools/mongodb-find.md index 3e32c0fad468..303f0d435a66 100644 --- a/docs/en/integrations/mongodb/mongodb-find.md +++ b/docs/en/integrations/mongodb/tools/mongodb-find.md @@ -1,5 +1,5 @@ --- -title: "mongodb-find Tool" +title: "mongodb-find" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mongodb/mongodb-insert-many.md b/docs/en/integrations/mongodb/tools/mongodb-insert-many.md similarity index 98% rename from docs/en/integrations/mongodb/mongodb-insert-many.md rename to docs/en/integrations/mongodb/tools/mongodb-insert-many.md index 275ebfddc558..a1cfd227d45f 100644 --- a/docs/en/integrations/mongodb/mongodb-insert-many.md +++ b/docs/en/integrations/mongodb/tools/mongodb-insert-many.md @@ -1,5 +1,5 @@ --- -title: "mongodb-insert-many Tool" +title: "mongodb-insert-many" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mongodb/mongodb-insert-one.md b/docs/en/integrations/mongodb/tools/mongodb-insert-one.md similarity index 98% rename from docs/en/integrations/mongodb/mongodb-insert-one.md rename to docs/en/integrations/mongodb/tools/mongodb-insert-one.md index a854d234c383..753131c90a45 100644 --- a/docs/en/integrations/mongodb/mongodb-insert-one.md +++ b/docs/en/integrations/mongodb/tools/mongodb-insert-one.md @@ -1,5 +1,5 @@ --- -title: "mongodb-insert-one Tool" +title: "mongodb-insert-one" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mongodb/mongodb-update-many.md b/docs/en/integrations/mongodb/tools/mongodb-update-many.md similarity index 99% rename from docs/en/integrations/mongodb/mongodb-update-many.md rename to docs/en/integrations/mongodb/tools/mongodb-update-many.md index 05729ec673f2..0f901ec9c84f 100644 --- a/docs/en/integrations/mongodb/mongodb-update-many.md +++ b/docs/en/integrations/mongodb/tools/mongodb-update-many.md @@ -1,5 +1,5 @@ --- -title: "mongodb-update-many Tool" +title: "mongodb-update-many" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mongodb/mongodb-update-one.md b/docs/en/integrations/mongodb/tools/mongodb-update-one.md similarity index 99% rename from docs/en/integrations/mongodb/mongodb-update-one.md rename to docs/en/integrations/mongodb/tools/mongodb-update-one.md index 7f054ec4257d..c02bf7bd06f6 100644 --- a/docs/en/integrations/mongodb/mongodb-update-one.md +++ b/docs/en/integrations/mongodb/tools/mongodb-update-one.md @@ -1,5 +1,5 @@ --- -title: "mongodb-update-one Tool" +title: "mongodb-update-one" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mssql/_index.md b/docs/en/integrations/mssql/_index.md index 317cdaa7e105..6db74752bfe3 100644 --- a/docs/en/integrations/mssql/_index.md +++ b/docs/en/integrations/mssql/_index.md @@ -1,63 +1,4 @@ --- -title: "SQL Server Source" -type: docs +title: "SQL Server" weight: 1 -description: > - SQL Server is a relational database management system (RDBMS). -no_list: true ---- - -## About - -[SQL Server][mssql-docs] is a relational database management system (RDBMS) -developed by Microsoft that allows users to store, retrieve, and manage large -amount of data through a structured format. - -[mssql-docs]: https://www.microsoft.com/en-us/sql-server - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source only uses standard authentication. You will need to [create a -SQL Server user][mssql-users] to login to the database with. - -[mssql-users]: - https://learn.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-database-user?view=sql-server-ver16 - -## Example - -```yaml -kind: sources -name: my-mssql-source -type: mssql -host: 127.0.0.1 -port: 1433 -database: my_db -user: ${USER_NAME} -password: ${PASSWORD} -# encrypt: strict -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "mssql". | -| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | -| port | string | true | Port to connect to (e.g. "1433"). | -| database | string | true | Name of the SQL Server database to connect to (e.g. "my_db"). | -| user | string | true | Name of the SQL Server user to connect as (e.g. "my-user"). | -| password | string | true | Password of the SQL Server user (e.g. "my-password"). | -| encrypt | string | false | Encryption level for data transmitted between the client and server (e.g., "strict"). If not specified, defaults to the [github.com/microsoft/go-mssqldb](https://github.com/microsoft/go-mssqldb?tab=readme-ov-file#common-parameters) package's default encrypt value. | +--- \ No newline at end of file diff --git a/docs/en/integrations/mssql/source.md b/docs/en/integrations/mssql/source.md new file mode 100644 index 000000000000..49a041b0a743 --- /dev/null +++ b/docs/en/integrations/mssql/source.md @@ -0,0 +1,64 @@ +--- +title: "SQL Server Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + SQL Server is a relational database management system (RDBMS). +no_list: true +--- + +## About + +[SQL Server][mssql-docs] is a relational database management system (RDBMS) +developed by Microsoft that allows users to store, retrieve, and manage large +amount of data through a structured format. + +[mssql-docs]: https://www.microsoft.com/en-us/sql-server + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source only uses standard authentication. You will need to [create a +SQL Server user][mssql-users] to login to the database with. + +[mssql-users]: + https://learn.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-database-user?view=sql-server-ver16 + +## Example + +```yaml +kind: sources +name: my-mssql-source +type: mssql +host: 127.0.0.1 +port: 1433 +database: my_db +user: ${USER_NAME} +password: ${PASSWORD} +# encrypt: strict +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "mssql". | +| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | +| port | string | true | Port to connect to (e.g. "1433"). | +| database | string | true | Name of the SQL Server database to connect to (e.g. "my_db"). | +| user | string | true | Name of the SQL Server user to connect as (e.g. "my-user"). | +| password | string | true | Password of the SQL Server user (e.g. "my-password"). | +| encrypt | string | false | Encryption level for data transmitted between the client and server (e.g., "strict"). If not specified, defaults to the [github.com/microsoft/go-mssqldb](https://github.com/microsoft/go-mssqldb?tab=readme-ov-file#common-parameters) package's default encrypt value. | diff --git a/docs/en/integrations/mssql/tools/_index.md b/docs/en/integrations/mssql/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/mssql/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/mssql/mssql-execute-sql.md b/docs/en/integrations/mssql/tools/mssql-execute-sql.md similarity index 97% rename from docs/en/integrations/mssql/mssql-execute-sql.md rename to docs/en/integrations/mssql/tools/mssql-execute-sql.md index 5fddab083289..1d5a94cccc47 100644 --- a/docs/en/integrations/mssql/mssql-execute-sql.md +++ b/docs/en/integrations/mssql/tools/mssql-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "mssql-execute-sql Tool" +title: "mssql-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mssql/mssql-list-tables.md b/docs/en/integrations/mssql/tools/mssql-list-tables.md similarity index 98% rename from docs/en/integrations/mssql/mssql-list-tables.md rename to docs/en/integrations/mssql/tools/mssql-list-tables.md index 9a29b808e3dc..f1e78d2b8000 100644 --- a/docs/en/integrations/mssql/mssql-list-tables.md +++ b/docs/en/integrations/mssql/tools/mssql-list-tables.md @@ -1,5 +1,5 @@ --- -title: "mssql-list-tables Tool" +title: "mssql-list-tables" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mssql/mssql-sql.md b/docs/en/integrations/mssql/tools/mssql-sql.md similarity index 99% rename from docs/en/integrations/mssql/mssql-sql.md rename to docs/en/integrations/mssql/tools/mssql-sql.md index b3904192f4a5..19941c1116a0 100644 --- a/docs/en/integrations/mssql/mssql-sql.md +++ b/docs/en/integrations/mssql/tools/mssql-sql.md @@ -1,5 +1,5 @@ --- -title: "mssql-sql Tool" +title: "mssql-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mysql/_index.md b/docs/en/integrations/mysql/_index.md index 15efa3197507..c0bf96c76777 100644 --- a/docs/en/integrations/mysql/_index.md +++ b/docs/en/integrations/mysql/_index.md @@ -1,66 +1,4 @@ --- -title: "MySQL Source" -type: docs +title: "MySQL" weight: 1 -description: > - MySQL is a relational database management system that stores and manages data. -no_list: true ---- - -## About - -[MySQL][mysql-docs] is a relational database management system (RDBMS) that -stores and manages data. It's a popular choice for developers because of its -reliability, performance, and ease of use. - -[mysql-docs]: https://www.mysql.com/ - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source only uses standard authentication. You will need to [create a -MySQL user][mysql-users] to login to the database with. - -[mysql-users]: https://dev.mysql.com/doc/refman/8.4/en/user-names.html - -## Example - -```yaml -kind: sources -name: my-mysql-source -type: mysql -host: 127.0.0.1 -port: 3306 -database: my_db -user: ${USER_NAME} -password: ${PASSWORD} -# Optional TLS and other driver parameters. For example, enable preferred TLS: -# queryParams: -# tls: preferred -queryTimeout: 30s # Optional: query timeout duration -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -| ------------ | :------: | :----------: | ----------------------------------------------------------------------------------------------- | -| type | string | true | Must be "mysql". | -| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | -| port | string | true | Port to connect to (e.g. "3306"). | -| database | string | true | Name of the MySQL database to connect to (e.g. "my_db"). | -| user | string | true | Name of the MySQL user to connect as (e.g. "my-mysql-user"). | -| password | string | true | Password of the MySQL user (e.g. "my-password"). | -| queryTimeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, no timeout is applied. | -| queryParams | map | false | Arbitrary DSN parameters passed to the driver (e.g. `tls: preferred`, `charset: utf8mb4`). Useful for enabling TLS or other connection options. | +--- \ No newline at end of file diff --git a/docs/en/integrations/mysql/source.md b/docs/en/integrations/mysql/source.md new file mode 100644 index 000000000000..596f77fc96b1 --- /dev/null +++ b/docs/en/integrations/mysql/source.md @@ -0,0 +1,67 @@ +--- +title: "MySQL Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + MySQL is a relational database management system that stores and manages data. +no_list: true +--- + +## About + +[MySQL][mysql-docs] is a relational database management system (RDBMS) that +stores and manages data. It's a popular choice for developers because of its +reliability, performance, and ease of use. + +[mysql-docs]: https://www.mysql.com/ + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source only uses standard authentication. You will need to [create a +MySQL user][mysql-users] to login to the database with. + +[mysql-users]: https://dev.mysql.com/doc/refman/8.4/en/user-names.html + +## Example + +```yaml +kind: sources +name: my-mysql-source +type: mysql +host: 127.0.0.1 +port: 3306 +database: my_db +user: ${USER_NAME} +password: ${PASSWORD} +# Optional TLS and other driver parameters. For example, enable preferred TLS: +# queryParams: +# tls: preferred +queryTimeout: 30s # Optional: query timeout duration +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +| ------------ | :------: | :----------: | ----------------------------------------------------------------------------------------------- | +| type | string | true | Must be "mysql". | +| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | +| port | string | true | Port to connect to (e.g. "3306"). | +| database | string | true | Name of the MySQL database to connect to (e.g. "my_db"). | +| user | string | true | Name of the MySQL user to connect as (e.g. "my-mysql-user"). | +| password | string | true | Password of the MySQL user (e.g. "my-password"). | +| queryTimeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, no timeout is applied. | +| queryParams | map | false | Arbitrary DSN parameters passed to the driver (e.g. `tls: preferred`, `charset: utf8mb4`). Useful for enabling TLS or other connection options. | diff --git a/docs/en/integrations/mysql/tools/_index.md b/docs/en/integrations/mysql/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/mysql/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/mysql/mysql-execute-sql.md b/docs/en/integrations/mysql/tools/mysql-execute-sql.md similarity index 98% rename from docs/en/integrations/mysql/mysql-execute-sql.md rename to docs/en/integrations/mysql/tools/mysql-execute-sql.md index 83e35a4425ae..834a99ef5589 100644 --- a/docs/en/integrations/mysql/mysql-execute-sql.md +++ b/docs/en/integrations/mysql/tools/mysql-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "mysql-execute-sql Tool" +title: "mysql-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mysql/mysql-get-query-plan.md b/docs/en/integrations/mysql/tools/mysql-get-query-plan.md similarity index 97% rename from docs/en/integrations/mysql/mysql-get-query-plan.md rename to docs/en/integrations/mysql/tools/mysql-get-query-plan.md index 0f9d6b3ac745..efb4bf958520 100644 --- a/docs/en/integrations/mysql/mysql-get-query-plan.md +++ b/docs/en/integrations/mysql/tools/mysql-get-query-plan.md @@ -1,5 +1,5 @@ --- -title: "mysql-get-query-plan Tool" +title: "mysql-get-query-plan" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mysql/mysql-list-active-queries.md b/docs/en/integrations/mysql/tools/mysql-list-active-queries.md similarity index 98% rename from docs/en/integrations/mysql/mysql-list-active-queries.md rename to docs/en/integrations/mysql/tools/mysql-list-active-queries.md index 61836aa9ca0b..36edfb083a93 100644 --- a/docs/en/integrations/mysql/mysql-list-active-queries.md +++ b/docs/en/integrations/mysql/tools/mysql-list-active-queries.md @@ -1,5 +1,5 @@ --- -title: "mysql-list-active-queries Tool" +title: "mysql-list-active-queries" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mysql/mysql-list-table-fragmentation.md b/docs/en/integrations/mysql/tools/mysql-list-table-fragmentation.md similarity index 98% rename from docs/en/integrations/mysql/mysql-list-table-fragmentation.md rename to docs/en/integrations/mysql/tools/mysql-list-table-fragmentation.md index 74d1ffe9372e..86278ea4f48b 100644 --- a/docs/en/integrations/mysql/mysql-list-table-fragmentation.md +++ b/docs/en/integrations/mysql/tools/mysql-list-table-fragmentation.md @@ -1,5 +1,5 @@ --- -title: "mysql-list-table-fragmentation Tool" +title: "mysql-list-table-fragmentation" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mysql/mysql-list-tables-missing-unique-indexes.md b/docs/en/integrations/mysql/tools/mysql-list-tables-missing-unique-indexes.md similarity index 97% rename from docs/en/integrations/mysql/mysql-list-tables-missing-unique-indexes.md rename to docs/en/integrations/mysql/tools/mysql-list-tables-missing-unique-indexes.md index bdbda21413a4..608e201dad5c 100644 --- a/docs/en/integrations/mysql/mysql-list-tables-missing-unique-indexes.md +++ b/docs/en/integrations/mysql/tools/mysql-list-tables-missing-unique-indexes.md @@ -1,5 +1,5 @@ --- -title: "mysql-list-tables-missing-unique-indexes Tool" +title: "mysql-list-tables-missing-unique-indexes" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mysql/mysql-list-tables.md b/docs/en/integrations/mysql/tools/mysql-list-tables.md similarity index 98% rename from docs/en/integrations/mysql/mysql-list-tables.md rename to docs/en/integrations/mysql/tools/mysql-list-tables.md index 58be49eca437..969d4158cf77 100644 --- a/docs/en/integrations/mysql/mysql-list-tables.md +++ b/docs/en/integrations/mysql/tools/mysql-list-tables.md @@ -1,5 +1,5 @@ --- -title: "mysql-list-tables Tool" +title: "mysql-list-tables" type: docs weight: 1 description: > diff --git a/docs/en/integrations/mysql/mysql-sql.md b/docs/en/integrations/mysql/tools/mysql-sql.md similarity index 99% rename from docs/en/integrations/mysql/mysql-sql.md rename to docs/en/integrations/mysql/tools/mysql-sql.md index a770d8b0075b..6a41e3bcd748 100644 --- a/docs/en/integrations/mysql/mysql-sql.md +++ b/docs/en/integrations/mysql/tools/mysql-sql.md @@ -1,5 +1,5 @@ --- -title: "mysql-sql Tool" +title: "mysql-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/neo4j/_index.md b/docs/en/integrations/neo4j/_index.md index 815a9c0642ac..d5e930456f83 100644 --- a/docs/en/integrations/neo4j/_index.md +++ b/docs/en/integrations/neo4j/_index.md @@ -1,58 +1,4 @@ --- -title: "Neo4j Source" -type: docs +title: "Neo4j" weight: 1 -description: > - Neo4j is a powerful, open source graph database system -no_list: true ---- - -## About - -[Neo4j][neo4j-docs] is a powerful, open source graph database system with over -15 years of active development that has earned it a strong reputation for -reliability, feature robustness, and performance. - -[neo4j-docs]: https://neo4j.com/docs - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source only uses standard authentication. You will need to [create a Neo4j -user][neo4j-users] to log in to the database with, or use the default `neo4j` -user if available. - -[neo4j-users]: https://neo4j.com/docs/operations-manual/current/authentication-authorization/manage-users/ - -## Example - -```yaml -kind: sources -name: my-neo4j-source -type: neo4j -uri: neo4j+s://xxxx.databases.neo4j.io:7687 -user: ${USER_NAME} -password: ${PASSWORD} -database: "neo4j" -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|----------------------------------------------------------------------| -| type | string | true | Must be "neo4j". | -| uri | string | true | Connect URI ("bolt://localhost", "neo4j+s://xxx.databases.neo4j.io") | -| user | string | true | Name of the Neo4j user to connect as (e.g. "neo4j"). | -| password | string | true | Password of the Neo4j user (e.g. "my-password"). | -| database | string | true | Name of the Neo4j database to connect to (e.g. "neo4j"). | +--- \ No newline at end of file diff --git a/docs/en/integrations/neo4j/samples/_index.md b/docs/en/integrations/neo4j/samples/_index.md new file mode 100644 index 000000000000..e9548b273e4a --- /dev/null +++ b/docs/en/integrations/neo4j/samples/_index.md @@ -0,0 +1,4 @@ +--- +title: "Samples" +weight: 3 +--- diff --git a/docs/en/build-with-mcp-toolbox/neo4j/mcp_quickstart.md b/docs/en/integrations/neo4j/samples/mcp_quickstart.md similarity index 97% rename from docs/en/build-with-mcp-toolbox/neo4j/mcp_quickstart.md rename to docs/en/integrations/neo4j/samples/mcp_quickstart.md index a654e1ea180d..910f544b95a8 100644 --- a/docs/en/build-with-mcp-toolbox/neo4j/mcp_quickstart.md +++ b/docs/en/integrations/neo4j/samples/mcp_quickstart.md @@ -4,11 +4,12 @@ type: docs weight: 1 description: > How to get started running Toolbox with MCP Inspector and Neo4j as the source. +sample_filters: ["Neo4j", "MCP Inspector"] --- ## Overview -[Model Context Protocol](https://modelcontextprotocol.io) is an open protocol that standardizes how applications provide context to LLMs. Check out this page on how to [connect to Toolbox via MCP](../../user-guide/connect-to/mcp-client/_index.md). +[Model Context Protocol](https://modelcontextprotocol.io) is an open protocol that standardizes how applications provide context to LLMs. Check out this page on how to [connect to Toolbox via MCP](../../../documentation/connect-to/mcp-client/_index.md). ## Step 1: Set up your Neo4j Database and Data diff --git a/docs/en/integrations/neo4j/source.md b/docs/en/integrations/neo4j/source.md new file mode 100644 index 000000000000..8700affce5e5 --- /dev/null +++ b/docs/en/integrations/neo4j/source.md @@ -0,0 +1,59 @@ +--- +title: "Neo4j Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Neo4j is a powerful, open source graph database system +no_list: true +--- + +## About + +[Neo4j][neo4j-docs] is a powerful, open source graph database system with over +15 years of active development that has earned it a strong reputation for +reliability, feature robustness, and performance. + +[neo4j-docs]: https://neo4j.com/docs + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source only uses standard authentication. You will need to [create a Neo4j +user][neo4j-users] to log in to the database with, or use the default `neo4j` +user if available. + +[neo4j-users]: https://neo4j.com/docs/operations-manual/current/authentication-authorization/manage-users/ + +## Example + +```yaml +kind: sources +name: my-neo4j-source +type: neo4j +uri: neo4j+s://xxxx.databases.neo4j.io:7687 +user: ${USER_NAME} +password: ${PASSWORD} +database: "neo4j" +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|----------------------------------------------------------------------| +| type | string | true | Must be "neo4j". | +| uri | string | true | Connect URI ("bolt://localhost", "neo4j+s://xxx.databases.neo4j.io") | +| user | string | true | Name of the Neo4j user to connect as (e.g. "neo4j"). | +| password | string | true | Password of the Neo4j user (e.g. "my-password"). | +| database | string | true | Name of the Neo4j database to connect to (e.g. "neo4j"). | diff --git a/docs/en/integrations/neo4j/tools/_index.md b/docs/en/integrations/neo4j/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/neo4j/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/neo4j/neo4j-cypher.md b/docs/en/integrations/neo4j/tools/neo4j-cypher.md similarity index 99% rename from docs/en/integrations/neo4j/neo4j-cypher.md rename to docs/en/integrations/neo4j/tools/neo4j-cypher.md index 91e130690127..3b7cd3c1f493 100644 --- a/docs/en/integrations/neo4j/neo4j-cypher.md +++ b/docs/en/integrations/neo4j/tools/neo4j-cypher.md @@ -1,5 +1,5 @@ --- -title: "neo4j-cypher Tool" +title: "neo4j-cypher" type: docs weight: 1 description: > diff --git a/docs/en/integrations/neo4j/neo4j-execute-cypher.md b/docs/en/integrations/neo4j/tools/neo4j-execute-cypher.md similarity index 98% rename from docs/en/integrations/neo4j/neo4j-execute-cypher.md rename to docs/en/integrations/neo4j/tools/neo4j-execute-cypher.md index 9e4a0dccacfb..bf9fa2a040d6 100644 --- a/docs/en/integrations/neo4j/neo4j-execute-cypher.md +++ b/docs/en/integrations/neo4j/tools/neo4j-execute-cypher.md @@ -1,5 +1,5 @@ --- -title: "neo4j-execute-cypher Tool" +title: "neo4j-execute-cypher" type: docs weight: 1 description: > diff --git a/docs/en/integrations/neo4j/neo4j-schema.md b/docs/en/integrations/neo4j/tools/neo4j-schema.md similarity index 98% rename from docs/en/integrations/neo4j/neo4j-schema.md rename to docs/en/integrations/neo4j/tools/neo4j-schema.md index 7ecc339d0289..ae3e0556996f 100644 --- a/docs/en/integrations/neo4j/neo4j-schema.md +++ b/docs/en/integrations/neo4j/tools/neo4j-schema.md @@ -1,5 +1,5 @@ --- -title: "neo4j-schema Tool" +title: "neo4j-schema" type: "docs" weight: 1 description: > diff --git a/docs/en/integrations/oceanbase/_index.md b/docs/en/integrations/oceanbase/_index.md index d48c077c7e56..9404e1a164d8 100644 --- a/docs/en/integrations/oceanbase/_index.md +++ b/docs/en/integrations/oceanbase/_index.md @@ -1,92 +1,4 @@ --- -title: "OceanBase Source" -type: docs +title: "OceanBase" weight: 1 -description: > - OceanBase is a distributed relational database that provides high availability, scalability, and compatibility with MySQL. -no_list: true ---- - -## About - -[OceanBase][oceanbase-docs] is a distributed relational database management -system (RDBMS) that provides high availability, scalability, and strong -consistency. It's designed to handle large-scale data processing and is -compatible with MySQL, making it easy for developers to migrate from MySQL to -OceanBase. - -[oceanbase-docs]: https://www.oceanbase.com/ - - -### Features - -#### MySQL Compatibility - -OceanBase is highly compatible with MySQL, supporting most MySQL SQL syntax, -data types, and functions. This makes it easy to migrate existing MySQL -applications to OceanBase. - -#### High Availability - -OceanBase provides automatic failover and data replication across multiple -nodes, ensuring high availability and data durability. - -#### Scalability - -OceanBase can scale horizontally by adding more nodes to the cluster, making it -suitable for large-scale applications. - -#### Strong Consistency - -OceanBase provides strong consistency guarantees, ensuring that all transactions -are ACID compliant. - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source only uses standard authentication. You will need to create an -OceanBase user to login to the database with. OceanBase supports -MySQL-compatible user management syntax. - -### Network Connectivity - -Ensure that your application can connect to the OceanBase cluster. OceanBase -typically runs on ports 2881 (for MySQL protocol) or 3881 (for MySQL protocol -with SSL). - -## Example - -```yaml -kind: sources -name: my-oceanbase-source -type: oceanbase -host: 127.0.0.1 -port: 2881 -database: my_db -user: ${USER_NAME} -password: ${PASSWORD} -queryTimeout: 30s # Optional: query timeout duration -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -| ------------ | :------: | :----------: |-------------------------------------------------------------------------------------------------| -| type | string | true | Must be "oceanbase". | -| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | -| port | string | true | Port to connect to (e.g. "2881"). | -| database | string | true | Name of the OceanBase database to connect to (e.g. "my_db"). | -| user | string | true | Name of the OceanBase user to connect as (e.g. "my-oceanbase-user"). | -| password | string | true | Password of the OceanBase user (e.g. "my-password"). | -| queryTimeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, no timeout is applied. | +--- \ No newline at end of file diff --git a/docs/en/integrations/oceanbase/source.md b/docs/en/integrations/oceanbase/source.md new file mode 100644 index 000000000000..d966f601c39b --- /dev/null +++ b/docs/en/integrations/oceanbase/source.md @@ -0,0 +1,93 @@ +--- +title: "OceanBase Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + OceanBase is a distributed relational database that provides high availability, scalability, and compatibility with MySQL. +no_list: true +--- + +## About + +[OceanBase][oceanbase-docs] is a distributed relational database management +system (RDBMS) that provides high availability, scalability, and strong +consistency. It's designed to handle large-scale data processing and is +compatible with MySQL, making it easy for developers to migrate from MySQL to +OceanBase. + +[oceanbase-docs]: https://www.oceanbase.com/ + + +### Features + +#### MySQL Compatibility + +OceanBase is highly compatible with MySQL, supporting most MySQL SQL syntax, +data types, and functions. This makes it easy to migrate existing MySQL +applications to OceanBase. + +#### High Availability + +OceanBase provides automatic failover and data replication across multiple +nodes, ensuring high availability and data durability. + +#### Scalability + +OceanBase can scale horizontally by adding more nodes to the cluster, making it +suitable for large-scale applications. + +#### Strong Consistency + +OceanBase provides strong consistency guarantees, ensuring that all transactions +are ACID compliant. + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source only uses standard authentication. You will need to create an +OceanBase user to login to the database with. OceanBase supports +MySQL-compatible user management syntax. + +### Network Connectivity + +Ensure that your application can connect to the OceanBase cluster. OceanBase +typically runs on ports 2881 (for MySQL protocol) or 3881 (for MySQL protocol +with SSL). + +## Example + +```yaml +kind: sources +name: my-oceanbase-source +type: oceanbase +host: 127.0.0.1 +port: 2881 +database: my_db +user: ${USER_NAME} +password: ${PASSWORD} +queryTimeout: 30s # Optional: query timeout duration +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +| ------------ | :------: | :----------: |-------------------------------------------------------------------------------------------------| +| type | string | true | Must be "oceanbase". | +| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | +| port | string | true | Port to connect to (e.g. "2881"). | +| database | string | true | Name of the OceanBase database to connect to (e.g. "my_db"). | +| user | string | true | Name of the OceanBase user to connect as (e.g. "my-oceanbase-user"). | +| password | string | true | Password of the OceanBase user (e.g. "my-password"). | +| queryTimeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, no timeout is applied. | diff --git a/docs/en/integrations/oceanbase/tools/_index.md b/docs/en/integrations/oceanbase/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/oceanbase/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/oceanbase/oceanbase-execute-sql.md b/docs/en/integrations/oceanbase/tools/oceanbase-execute-sql.md similarity index 97% rename from docs/en/integrations/oceanbase/oceanbase-execute-sql.md rename to docs/en/integrations/oceanbase/tools/oceanbase-execute-sql.md index 452478d5bd60..4aa281b46f89 100644 --- a/docs/en/integrations/oceanbase/oceanbase-execute-sql.md +++ b/docs/en/integrations/oceanbase/tools/oceanbase-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "oceanbase-execute-sql Tool" +title: "oceanbase-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/oceanbase/oceanbase-sql.md b/docs/en/integrations/oceanbase/tools/oceanbase-sql.md similarity index 99% rename from docs/en/integrations/oceanbase/oceanbase-sql.md rename to docs/en/integrations/oceanbase/tools/oceanbase-sql.md index 7182bda027c8..8e6c7048b91e 100644 --- a/docs/en/integrations/oceanbase/oceanbase-sql.md +++ b/docs/en/integrations/oceanbase/tools/oceanbase-sql.md @@ -1,5 +1,5 @@ --- -title: "oceanbase-sql Tool" +title: "oceanbase-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/oracle/_index.md b/docs/en/integrations/oracle/_index.md index ec04a6dc4ef8..c445130fa080 100644 --- a/docs/en/integrations/oracle/_index.md +++ b/docs/en/integrations/oracle/_index.md @@ -1,169 +1,4 @@ --- -title: "Oracle Source" -type: docs +title: "Oracle" weight: 1 -description: > - Oracle Database is a widely-used relational database management system. -no_list: true ---- - -## About - -[Oracle Database][oracle-docs] is a multi-model database management system -produced and marketed by Oracle Corporation. It is commonly used for running -online transaction processing (OLTP), data warehousing (DW), and mixed (OLTP & -DW) database workloads. - -[oracle-docs]: https://www.oracle.com/database/ - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source uses standard authentication. You will need to [create an Oracle -user][oracle-users] to log in to the database with the necessary permissions. - -[oracle-users]: - https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/CREATE-USER.html - -### Oracle Driver Requirement (Conditional) - -The Oracle source offers two connection drivers: - -1. **Pure Go Driver (`useOCI: false`, default):** Uses the `go-ora` library. - This driver is simpler and does not require any local Oracle software - installation, but it **lacks support for advanced features** like Oracle - Wallets or Kerberos authentication. - -2. **OCI-Based Driver (`useOCI: true`):** Uses the `godror` library, which - provides access to **advanced Oracle features** like Digital Wallet support. - -If you set `useOCI: true`, you **must** install the **Oracle Instant Client** -libraries on the machine where this tool runs. - -You can download the Instant Client from the official Oracle website: [Oracle -Instant Client -Downloads](https://www.oracle.com/database/technologies/instant-client/downloads.html) - -### Connection Methods - -You can configure the connection to your Oracle database using one of the -following three methods. **You should only use one method** in your source -configuration. - -#### Basic Connection (Host/Port/Service Name) - -This is the most straightforward method, where you provide the connection -details as separate fields: - -- `host`: The IP address or hostname of the database server. -- `port`: The port number the Oracle listener is running on (typically 1521). -- `serviceName`: The service name for the database instance you wish to connect - to. - -#### Connection String - -As an alternative, you can provide all the connection details in a single -`connectionString`. This is a convenient way to consolidate the connection -information. The typical format is `hostname:port/servicename`. - -#### TNS Alias - -For environments that use a `tnsnames.ora` configuration file, you can connect -using a TNS (Transparent Network Substrate) alias. - -- `tnsAlias`: Specify the alias name defined in your `tnsnames.ora` file. -- `tnsAdmin` (Optional): If your configuration file is not in a standard - location, you can use this field to provide the path to the directory - containing it. This setting will override the `TNS_ADMIN` environment - variable. - -## Example - -This example demonstrates the four connection methods you could choose from: - -```yaml -kind: sources -name: my-oracle-source -type: oracle - -# --- Choose one connection method --- -# 1. Host, Port, and Service Name -host: 127.0.0.1 -port: 1521 -serviceName: XEPDB1 - -# 2. Direct Connection String -connectionString: "127.0.0.1:1521/XEPDB1" - -# 3. TNS Alias (requires tnsnames.ora) -tnsAlias: "MY_DB_ALIAS" -tnsAdmin: "/opt/oracle/network/admin" # Optional: overrides TNS_ADMIN env var - -user: ${USER_NAME} -password: ${PASSWORD} - -# Optional: Set to true to use the OCI-based driver for advanced features (Requires Oracle Instant Client) -``` - -### Using an Oracle Wallet - -Oracle Wallet allows you to store credentails used for database connection. Depending whether you are using an OCI-based driver, the wallet configuration is different. - -#### Pure Go Driver (`useOCI: false`) - Oracle Wallet - -The `go-ora` driver uses the `walletLocation` field to connect to a database secured with an Oracle Wallet without standard username and password. - -```yaml -kind: sources -name: pure-go-wallet -type: oracle -connectionString: "127.0.0.1:1521/XEPDB1" -user: ${USER_NAME} -password: ${PASSWORD} -# The TNS Alias is often required to connect to a service registered in tnsnames.ora -tnsAlias: "SECURE_DB_ALIAS" -walletLocation: "/path/to/my/wallet/directory" -``` - -#### OCI-Based Driver (`useOCI: true`) - Oracle Wallet - -For the OCI-based driver, wallet authentication is triggered by setting tnsAdmin to the wallet directory and connecting via a tnsAlias. - -```yaml -kind: sources -name: oci-wallet -type: oracle -connectionString: "127.0.0.1:1521/XEPDB1" -user: ${USER_NAME} -password: ${PASSWORD} -tnsAlias: "WALLET_DB_ALIAS" -tnsAdmin: "/opt/oracle/wallet" # Directory containing tnsnames.ora, sqlnet.ora, and wallet files -useOCI: true -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|------------------|:--------:|:------------:|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "oracle". | -| user | string | true | Name of the Oracle user to connect as (e.g. "my-oracle-user"). | -| password | string | true | Password of the Oracle user (e.g. "my-password"). | -| host | string | false | IP address or hostname to connect to (e.g. "127.0.0.1"). Required if not using `connectionString` or `tnsAlias`. | -| port | integer | false | Port to connect to (e.g. "1521"). Required if not using `connectionString` or `tnsAlias`. | -| serviceName | string | false | The Oracle service name of the database to connect to. Required if not using `connectionString` or `tnsAlias`. | -| connectionString | string | false | A direct connection string (e.g. "hostname:port/servicename"). Use as an alternative to `host`, `port`, and `serviceName`. | -| tnsAlias | string | false | A TNS alias from a `tnsnames.ora` file. Use as an alternative to `host`/`port` or `connectionString`. | -| tnsAdmin | string | false | Path to the directory containing the `tnsnames.ora` file. This overrides the `TNS_ADMIN` environment variable if it is set. | -| useOCI | bool | false | If true, uses the OCI-based driver (godror) which supports Oracle Wallet/Kerberos but requires the Oracle Instant Client libraries to be installed. Defaults to false (pure Go driver). | +--- \ No newline at end of file diff --git a/docs/en/integrations/oracle/source.md b/docs/en/integrations/oracle/source.md new file mode 100644 index 000000000000..f1b97002139f --- /dev/null +++ b/docs/en/integrations/oracle/source.md @@ -0,0 +1,170 @@ +--- +title: "Oracle Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Oracle Database is a widely-used relational database management system. +no_list: true +--- + +## About + +[Oracle Database][oracle-docs] is a multi-model database management system +produced and marketed by Oracle Corporation. It is commonly used for running +online transaction processing (OLTP), data warehousing (DW), and mixed (OLTP & +DW) database workloads. + +[oracle-docs]: https://www.oracle.com/database/ + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source uses standard authentication. You will need to [create an Oracle +user][oracle-users] to log in to the database with the necessary permissions. + +[oracle-users]: + https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/CREATE-USER.html + +### Oracle Driver Requirement (Conditional) + +The Oracle source offers two connection drivers: + +1. **Pure Go Driver (`useOCI: false`, default):** Uses the `go-ora` library. + This driver is simpler and does not require any local Oracle software + installation, but it **lacks support for advanced features** like Oracle + Wallets or Kerberos authentication. + +2. **OCI-Based Driver (`useOCI: true`):** Uses the `godror` library, which + provides access to **advanced Oracle features** like Digital Wallet support. + +If you set `useOCI: true`, you **must** install the **Oracle Instant Client** +libraries on the machine where this tool runs. + +You can download the Instant Client from the official Oracle website: [Oracle +Instant Client +Downloads](https://www.oracle.com/database/technologies/instant-client/downloads.html) + +### Connection Methods + +You can configure the connection to your Oracle database using one of the +following three methods. **You should only use one method** in your source +configuration. + +#### Basic Connection (Host/Port/Service Name) + +This is the most straightforward method, where you provide the connection +details as separate fields: + +- `host`: The IP address or hostname of the database server. +- `port`: The port number the Oracle listener is running on (typically 1521). +- `serviceName`: The service name for the database instance you wish to connect + to. + +#### Connection String + +As an alternative, you can provide all the connection details in a single +`connectionString`. This is a convenient way to consolidate the connection +information. The typical format is `hostname:port/servicename`. + +#### TNS Alias + +For environments that use a `tnsnames.ora` configuration file, you can connect +using a TNS (Transparent Network Substrate) alias. + +- `tnsAlias`: Specify the alias name defined in your `tnsnames.ora` file. +- `tnsAdmin` (Optional): If your configuration file is not in a standard + location, you can use this field to provide the path to the directory + containing it. This setting will override the `TNS_ADMIN` environment + variable. + +## Example + +This example demonstrates the four connection methods you could choose from: + +```yaml +kind: sources +name: my-oracle-source +type: oracle + +# --- Choose one connection method --- +# 1. Host, Port, and Service Name +host: 127.0.0.1 +port: 1521 +serviceName: XEPDB1 + +# 2. Direct Connection String +connectionString: "127.0.0.1:1521/XEPDB1" + +# 3. TNS Alias (requires tnsnames.ora) +tnsAlias: "MY_DB_ALIAS" +tnsAdmin: "/opt/oracle/network/admin" # Optional: overrides TNS_ADMIN env var + +user: ${USER_NAME} +password: ${PASSWORD} + +# Optional: Set to true to use the OCI-based driver for advanced features (Requires Oracle Instant Client) +``` + +### Using an Oracle Wallet + +Oracle Wallet allows you to store credentails used for database connection. Depending whether you are using an OCI-based driver, the wallet configuration is different. + +#### Pure Go Driver (`useOCI: false`) - Oracle Wallet + +The `go-ora` driver uses the `walletLocation` field to connect to a database secured with an Oracle Wallet without standard username and password. + +```yaml +kind: sources +name: pure-go-wallet +type: oracle +connectionString: "127.0.0.1:1521/XEPDB1" +user: ${USER_NAME} +password: ${PASSWORD} +# The TNS Alias is often required to connect to a service registered in tnsnames.ora +tnsAlias: "SECURE_DB_ALIAS" +walletLocation: "/path/to/my/wallet/directory" +``` + +#### OCI-Based Driver (`useOCI: true`) - Oracle Wallet + +For the OCI-based driver, wallet authentication is triggered by setting tnsAdmin to the wallet directory and connecting via a tnsAlias. + +```yaml +kind: sources +name: oci-wallet +type: oracle +connectionString: "127.0.0.1:1521/XEPDB1" +user: ${USER_NAME} +password: ${PASSWORD} +tnsAlias: "WALLET_DB_ALIAS" +tnsAdmin: "/opt/oracle/wallet" # Directory containing tnsnames.ora, sqlnet.ora, and wallet files +useOCI: true +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|------------------|:--------:|:------------:|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "oracle". | +| user | string | true | Name of the Oracle user to connect as (e.g. "my-oracle-user"). | +| password | string | true | Password of the Oracle user (e.g. "my-password"). | +| host | string | false | IP address or hostname to connect to (e.g. "127.0.0.1"). Required if not using `connectionString` or `tnsAlias`. | +| port | integer | false | Port to connect to (e.g. "1521"). Required if not using `connectionString` or `tnsAlias`. | +| serviceName | string | false | The Oracle service name of the database to connect to. Required if not using `connectionString` or `tnsAlias`. | +| connectionString | string | false | A direct connection string (e.g. "hostname:port/servicename"). Use as an alternative to `host`, `port`, and `serviceName`. | +| tnsAlias | string | false | A TNS alias from a `tnsnames.ora` file. Use as an alternative to `host`/`port` or `connectionString`. | +| tnsAdmin | string | false | Path to the directory containing the `tnsnames.ora` file. This overrides the `TNS_ADMIN` environment variable if it is set. | +| useOCI | bool | false | If true, uses the OCI-based driver (godror) which supports Oracle Wallet/Kerberos but requires the Oracle Instant Client libraries to be installed. Defaults to false (pure Go driver). | diff --git a/docs/en/integrations/oracle/tools/_index.md b/docs/en/integrations/oracle/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/oracle/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/oracle/oracle-execute-sql.md b/docs/en/integrations/oracle/tools/oracle-execute-sql.md similarity index 95% rename from docs/en/integrations/oracle/oracle-execute-sql.md rename to docs/en/integrations/oracle/tools/oracle-execute-sql.md index b7a387e9ca68..7379ceeb294e 100644 --- a/docs/en/integrations/oracle/oracle-execute-sql.md +++ b/docs/en/integrations/oracle/tools/oracle-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "oracle-execute-sql Tool" +title: "oracle-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/oracle/oracle-sql.md b/docs/en/integrations/oracle/tools/oracle-sql.md similarity index 98% rename from docs/en/integrations/oracle/oracle-sql.md rename to docs/en/integrations/oracle/tools/oracle-sql.md index dcdff1928e44..29ad27af8706 100644 --- a/docs/en/integrations/oracle/oracle-sql.md +++ b/docs/en/integrations/oracle/tools/oracle-sql.md @@ -1,5 +1,5 @@ --- -title: "oracle-sql Tool" +title: "oracle-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/_index.md b/docs/en/integrations/postgres/_index.md index 24720b018830..17dbd6ec4431 100644 --- a/docs/en/integrations/postgres/_index.md +++ b/docs/en/integrations/postgres/_index.md @@ -1,67 +1,4 @@ --- -title: "PostgreSQL Source" -type: docs +title: "PostgreSQL" weight: 1 -description: > - PostgreSQL is a powerful, open source object-relational database. -no_list: true ---- - -## About - -[PostgreSQL][pg-docs] is a powerful, open source object-relational database -system with over 35 years of active development that has earned it a strong -reputation for reliability, feature robustness, and performance. - -[pg-docs]: https://www.postgresql.org/ - - - -## Available Tools - -{{< list-tools >}} - -### Pre-built Configurations - -- [PostgreSQL using MCP](../../user-guide/connect-to/ides/postgres_mcp.md) -Connect your IDE to PostgreSQL using Toolbox. - -## Requirements - -### Database User - -This source only uses standard authentication. You will need to [create a -PostgreSQL user][pg-users] to login to the database with. - -[pg-users]: https://www.postgresql.org/docs/current/sql-createuser.html - -## Example - -```yaml -kind: sources -name: my-pg-source -type: postgres -host: 127.0.0.1 -port: 5432 -database: my_db -user: ${USER_NAME} -password: ${PASSWORD} -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|-------------|:------------------:|:------------:|------------------------------------------------------------------------| -| type | string | true | Must be "postgres". | -| host | string | true | IP address to connect to (e.g. "127.0.0.1") | -| port | string | true | Port to connect to (e.g. "5432") | -| database | string | true | Name of the Postgres database to connect to (e.g. "my_db"). | -| user | string | true | Name of the Postgres user to connect as (e.g. "my-pg-user"). | -| password | string | true | Password of the Postgres user (e.g. "my-password"). | -| queryParams | map[string]string | false | Raw query to be added to the db connection string. | -| queryExecMode | string | false | pgx query execution mode. Valid values: `cache_statement` (default), `cache_describe`, `describe_exec`, `exec`, `simple_protocol`. Useful with connection poolers that don't support prepared statement caching. | +--- \ No newline at end of file diff --git a/docs/en/integrations/postgres/source.md b/docs/en/integrations/postgres/source.md new file mode 100644 index 000000000000..4140cfc2107d --- /dev/null +++ b/docs/en/integrations/postgres/source.md @@ -0,0 +1,67 @@ +--- +title: "PostgreSQL Source" +type: docs +weight: 1 +description: > + PostgreSQL is a powerful, open source object-relational database. +no_list: true +--- + +## About + +[PostgreSQL][pg-docs] is a powerful, open source object-relational database +system with over 35 years of active development that has earned it a strong +reputation for reliability, feature robustness, and performance. + +[pg-docs]: https://www.postgresql.org/ + + + +## Available Tools + +{{< list-tools >}} + +### Pre-built Configurations + +- [PostgreSQL using MCP](../../documentation/connect-to/ides/postgres_mcp.md) +Connect your IDE to PostgreSQL using Toolbox. + +## Requirements + +### Database User + +This source only uses standard authentication. You will need to [create a +PostgreSQL user][pg-users] to login to the database with. + +[pg-users]: https://www.postgresql.org/docs/current/sql-createuser.html + +## Example + +```yaml +kind: sources +name: my-pg-source +type: postgres +host: 127.0.0.1 +port: 5432 +database: my_db +user: ${USER_NAME} +password: ${PASSWORD} +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|-------------|:------------------:|:------------:|------------------------------------------------------------------------| +| type | string | true | Must be "postgres". | +| host | string | true | IP address to connect to (e.g. "127.0.0.1") | +| port | string | true | Port to connect to (e.g. "5432") | +| database | string | true | Name of the Postgres database to connect to (e.g. "my_db"). | +| user | string | true | Name of the Postgres user to connect as (e.g. "my-pg-user"). | +| password | string | true | Password of the Postgres user (e.g. "my-password"). | +| queryParams | map[string]string | false | Raw query to be added to the db connection string. | +| queryExecMode | string | false | pgx query execution mode. Valid values: `cache_statement` (default), `cache_describe`, `describe_exec`, `exec`, `simple_protocol`. Useful with connection poolers that don't support prepared statement caching. | diff --git a/docs/en/integrations/postgres/tools/_index.md b/docs/en/integrations/postgres/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/postgres/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/postgres/postgres-database-overview.md b/docs/en/integrations/postgres/tools/postgres-database-overview.md similarity index 97% rename from docs/en/integrations/postgres/postgres-database-overview.md rename to docs/en/integrations/postgres/tools/postgres-database-overview.md index 3f6ec6e3ddf7..9502b2e3dcc0 100644 --- a/docs/en/integrations/postgres/postgres-database-overview.md +++ b/docs/en/integrations/postgres/tools/postgres-database-overview.md @@ -1,5 +1,5 @@ --- -title: "postgres-database-overview Tool" +title: "postgres-database-overview" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-execute-sql.md b/docs/en/integrations/postgres/tools/postgres-execute-sql.md similarity index 97% rename from docs/en/integrations/postgres/postgres-execute-sql.md rename to docs/en/integrations/postgres/tools/postgres-execute-sql.md index 182db3715147..064224ccfaf1 100644 --- a/docs/en/integrations/postgres/postgres-execute-sql.md +++ b/docs/en/integrations/postgres/tools/postgres-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "postgres-execute-sql Tool" +title: "postgres-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-get-column-cardinality.md b/docs/en/integrations/postgres/tools/postgres-get-column-cardinality.md similarity index 98% rename from docs/en/integrations/postgres/postgres-get-column-cardinality.md rename to docs/en/integrations/postgres/tools/postgres-get-column-cardinality.md index 8edc261dbe59..0de0d066b671 100644 --- a/docs/en/integrations/postgres/postgres-get-column-cardinality.md +++ b/docs/en/integrations/postgres/tools/postgres-get-column-cardinality.md @@ -1,5 +1,5 @@ --- -title: "postgres-get-column-cardinality Tool" +title: "postgres-get-column-cardinality" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-active-queries.md b/docs/en/integrations/postgres/tools/postgres-list-active-queries.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-active-queries.md rename to docs/en/integrations/postgres/tools/postgres-list-active-queries.md index 525d3f0f2bf4..6e5a157a8bf0 100644 --- a/docs/en/integrations/postgres/postgres-list-active-queries.md +++ b/docs/en/integrations/postgres/tools/postgres-list-active-queries.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-active-queries Tool" +title: "postgres-list-active-queries" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-available-extensions.md b/docs/en/integrations/postgres/tools/postgres-list-available-extensions.md similarity index 97% rename from docs/en/integrations/postgres/postgres-list-available-extensions.md rename to docs/en/integrations/postgres/tools/postgres-list-available-extensions.md index 23eaae730dbb..d0c5316cb421 100644 --- a/docs/en/integrations/postgres/postgres-list-available-extensions.md +++ b/docs/en/integrations/postgres/tools/postgres-list-available-extensions.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-available-extensions Tool" +title: "postgres-list-available-extensions" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-database-stats.md b/docs/en/integrations/postgres/tools/postgres-list-database-stats.md similarity index 99% rename from docs/en/integrations/postgres/postgres-list-database-stats.md rename to docs/en/integrations/postgres/tools/postgres-list-database-stats.md index 5ca42ab74b30..190845a3d923 100644 --- a/docs/en/integrations/postgres/postgres-list-database-stats.md +++ b/docs/en/integrations/postgres/tools/postgres-list-database-stats.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-database-stats Tool" +title: "postgres-list-database-stats" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-indexes.md b/docs/en/integrations/postgres/tools/postgres-list-indexes.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-indexes.md rename to docs/en/integrations/postgres/tools/postgres-list-indexes.md index de4c2a74951b..3a578453aa98 100644 --- a/docs/en/integrations/postgres/postgres-list-indexes.md +++ b/docs/en/integrations/postgres/tools/postgres-list-indexes.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-indexes Tool" +title: "postgres-list-indexes" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-installed-extensions.md b/docs/en/integrations/postgres/tools/postgres-list-installed-extensions.md similarity index 96% rename from docs/en/integrations/postgres/postgres-list-installed-extensions.md rename to docs/en/integrations/postgres/tools/postgres-list-installed-extensions.md index dc2ff88b8649..abacf625d91d 100644 --- a/docs/en/integrations/postgres/postgres-list-installed-extensions.md +++ b/docs/en/integrations/postgres/tools/postgres-list-installed-extensions.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-installed-extensions Tool" +title: "postgres-list-installed-extensions" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-locks.md b/docs/en/integrations/postgres/tools/postgres-list-locks.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-locks.md rename to docs/en/integrations/postgres/tools/postgres-list-locks.md index bb8a904ea9d2..7919ae7d6492 100644 --- a/docs/en/integrations/postgres/postgres-list-locks.md +++ b/docs/en/integrations/postgres/tools/postgres-list-locks.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-locks Tool" +title: "postgres-list-locks" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-pg-settings.md b/docs/en/integrations/postgres/tools/postgres-list-pg-settings.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-pg-settings.md rename to docs/en/integrations/postgres/tools/postgres-list-pg-settings.md index 7763aa728342..f9d699e08c79 100644 --- a/docs/en/integrations/postgres/postgres-list-pg-settings.md +++ b/docs/en/integrations/postgres/tools/postgres-list-pg-settings.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-pg-settings Tool" +title: "postgres-list-pg-settings" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-publication-tables.md b/docs/en/integrations/postgres/tools/postgres-list-publication-tables.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-publication-tables.md rename to docs/en/integrations/postgres/tools/postgres-list-publication-tables.md index 7f2b6a4dbff2..0cb8a53a96b7 100644 --- a/docs/en/integrations/postgres/postgres-list-publication-tables.md +++ b/docs/en/integrations/postgres/tools/postgres-list-publication-tables.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-publication-tables Tool" +title: "postgres-list-publication-tables" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-query-stats.md b/docs/en/integrations/postgres/tools/postgres-list-query-stats.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-query-stats.md rename to docs/en/integrations/postgres/tools/postgres-list-query-stats.md index 7473b18ab2f1..1f46d8dca69c 100644 --- a/docs/en/integrations/postgres/postgres-list-query-stats.md +++ b/docs/en/integrations/postgres/tools/postgres-list-query-stats.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-query-stats Tool" +title: "postgres-list-query-stats" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-roles.md b/docs/en/integrations/postgres/tools/postgres-list-roles.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-roles.md rename to docs/en/integrations/postgres/tools/postgres-list-roles.md index 6d3f63f086ca..7cb126c74c58 100644 --- a/docs/en/integrations/postgres/postgres-list-roles.md +++ b/docs/en/integrations/postgres/tools/postgres-list-roles.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-roles Tool" +title: "postgres-list-roles" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-schemas.md b/docs/en/integrations/postgres/tools/postgres-list-schemas.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-schemas.md rename to docs/en/integrations/postgres/tools/postgres-list-schemas.md index 0ef7141925e9..2393e7eb18e7 100644 --- a/docs/en/integrations/postgres/postgres-list-schemas.md +++ b/docs/en/integrations/postgres/tools/postgres-list-schemas.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-schemas Tool" +title: "postgres-list-schemas" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-sequences.md b/docs/en/integrations/postgres/tools/postgres-list-sequences.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-sequences.md rename to docs/en/integrations/postgres/tools/postgres-list-sequences.md index 0324f694abcc..e8affd7f559d 100644 --- a/docs/en/integrations/postgres/postgres-list-sequences.md +++ b/docs/en/integrations/postgres/tools/postgres-list-sequences.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-sequences Tool" +title: "postgres-list-sequences" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-stored-procedure.md b/docs/en/integrations/postgres/tools/postgres-list-stored-procedure.md similarity index 99% rename from docs/en/integrations/postgres/postgres-list-stored-procedure.md rename to docs/en/integrations/postgres/tools/postgres-list-stored-procedure.md index 0d44569f33c6..dbad43ba4fb1 100644 --- a/docs/en/integrations/postgres/postgres-list-stored-procedure.md +++ b/docs/en/integrations/postgres/tools/postgres-list-stored-procedure.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-stored-procedure Tool" +title: "postgres-list-stored-procedure" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-table-stats.md b/docs/en/integrations/postgres/tools/postgres-list-table-stats.md similarity index 99% rename from docs/en/integrations/postgres/postgres-list-table-stats.md rename to docs/en/integrations/postgres/tools/postgres-list-table-stats.md index 2e36f5953b0a..f6db86ea06d4 100644 --- a/docs/en/integrations/postgres/postgres-list-table-stats.md +++ b/docs/en/integrations/postgres/tools/postgres-list-table-stats.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-table-stats Tool" +title: "postgres-list-table-stats" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-tables.md b/docs/en/integrations/postgres/tools/postgres-list-tables.md similarity index 97% rename from docs/en/integrations/postgres/postgres-list-tables.md rename to docs/en/integrations/postgres/tools/postgres-list-tables.md index 641c24e1a16f..1a699446dbab 100644 --- a/docs/en/integrations/postgres/postgres-list-tables.md +++ b/docs/en/integrations/postgres/tools/postgres-list-tables.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-tables Tool" +title: "postgres-list-tables" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-tablespaces.md b/docs/en/integrations/postgres/tools/postgres-list-tablespaces.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-tablespaces.md rename to docs/en/integrations/postgres/tools/postgres-list-tablespaces.md index f227aae8e161..2d93b979c05a 100644 --- a/docs/en/integrations/postgres/postgres-list-tablespaces.md +++ b/docs/en/integrations/postgres/tools/postgres-list-tablespaces.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-tablespaces Tool" +title: "postgres-list-tablespaces" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-triggers.md b/docs/en/integrations/postgres/tools/postgres-list-triggers.md similarity index 98% rename from docs/en/integrations/postgres/postgres-list-triggers.md rename to docs/en/integrations/postgres/tools/postgres-list-triggers.md index 4b13fa012f1b..a8ff3b038621 100644 --- a/docs/en/integrations/postgres/postgres-list-triggers.md +++ b/docs/en/integrations/postgres/tools/postgres-list-triggers.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-triggers Tool" +title: "postgres-list-triggers" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-list-views.md b/docs/en/integrations/postgres/tools/postgres-list-views.md similarity index 97% rename from docs/en/integrations/postgres/postgres-list-views.md rename to docs/en/integrations/postgres/tools/postgres-list-views.md index 46ce3f2d4229..bd1013f3ab5c 100644 --- a/docs/en/integrations/postgres/postgres-list-views.md +++ b/docs/en/integrations/postgres/tools/postgres-list-views.md @@ -1,5 +1,5 @@ --- -title: "postgres-list-views Tool" +title: "postgres-list-views" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-long-running-transactions.md b/docs/en/integrations/postgres/tools/postgres-long-running-transactions.md similarity index 98% rename from docs/en/integrations/postgres/postgres-long-running-transactions.md rename to docs/en/integrations/postgres/tools/postgres-long-running-transactions.md index e0e374109ba1..9f64862f480d 100644 --- a/docs/en/integrations/postgres/postgres-long-running-transactions.md +++ b/docs/en/integrations/postgres/tools/postgres-long-running-transactions.md @@ -1,5 +1,5 @@ --- -title: "postgres-long-running-transactions Tool" +title: "postgres-long-running-transactions" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-replication-stats.md b/docs/en/integrations/postgres/tools/postgres-replication-stats.md similarity index 98% rename from docs/en/integrations/postgres/postgres-replication-stats.md rename to docs/en/integrations/postgres/tools/postgres-replication-stats.md index 2abb6c2ade6c..1af392f30f3a 100644 --- a/docs/en/integrations/postgres/postgres-replication-stats.md +++ b/docs/en/integrations/postgres/tools/postgres-replication-stats.md @@ -1,5 +1,5 @@ --- -title: "postgres-replication-stats Tool" +title: "postgres-replication-stats" type: docs weight: 1 description: > diff --git a/docs/en/integrations/postgres/postgres-sql.md b/docs/en/integrations/postgres/tools/postgres-sql.md similarity index 99% rename from docs/en/integrations/postgres/postgres-sql.md rename to docs/en/integrations/postgres/tools/postgres-sql.md index d697a53fa616..d901cf8c816f 100644 --- a/docs/en/integrations/postgres/postgres-sql.md +++ b/docs/en/integrations/postgres/tools/postgres-sql.md @@ -1,5 +1,5 @@ --- -title: "postgres-sql Tool" +title: "postgres-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/redis/_index.md b/docs/en/integrations/redis/_index.md index 7c32306f64b9..5dc608690d9e 100644 --- a/docs/en/integrations/redis/_index.md +++ b/docs/en/integrations/redis/_index.md @@ -1,108 +1,4 @@ --- -title: "Redis Source" -linkTitle: "Redis" -type: docs +title: "Redis" weight: 1 -description: > - Redis is a in-memory data structure store. -no_list: true ---- - -## About - -Redis is a in-memory data structure store, used as a database, -cache, and message broker. It supports data structures such as strings, hashes, -lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, and -geospatial indexes with radius queries. - -If you are new to Redis, you can find installation and getting started guides on -the [official Redis website](https://redis.io/docs/). - -## Available Tools - -{{< list-tools >}} - -## Requirements - -## Example - -### Redis - -[AUTH string][auth] is a password for connection to Redis. If you have the -`requirepass` directive set in your Redis configuration, incoming client -connections must authenticate in order to connect. - -Specify your AUTH string in the password field: - -```yaml -kind: sources -name: my-redis-instance -type: redis -address: - - 127.0.0.1:6379 -username: ${MY_USER_NAME} -password: ${MY_AUTH_STRING} # Omit this field if you don't have a password. -# database: 0 -# clusterEnabled: false -# useGCPIAM: false -# tls: -# enabled: false -# insecureSkipVerify: false -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -### Memorystore For Redis - -Memorystore standalone instances support authentication using an [AUTH][auth] -string. - -Here is an example tools.yaml config with [AUTH][auth] enabled: - -```yaml -kind: sources -name: my-redis-cluster-instance -type: redis -address: - - 127.0.0.1:6379 -password: ${MY_AUTH_STRING} -# useGCPIAM: false -# clusterEnabled: false -``` - -Memorystore Redis Cluster supports IAM authentication instead. Grant your -account the required [IAM role][iam] and make sure to set `useGCPIAM` to `true`. - -Here is an example tools.yaml config for Memorystore Redis Cluster instances -using IAM authentication: - -```yaml -kind: sources -name: my-redis-cluster-instance -type: redis -address: - - 127.0.0.1:6379 -useGCPIAM: true -clusterEnabled: true -``` - -[iam]: https://cloud.google.com/memorystore/docs/cluster/about-iam-auth - -## Reference - -| **field** | **type** | **required** | **description** | -|------------------------|:--------:|:------------:|-----------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "redis". | -| address | string | true | Primary endpoint for the Memorystore Redis instance to connect to. | -| username | string | false | If you are using a non-default user, specify the user name here. If you are using Memorystore for Redis, leave this field blank | -| password | string | false | If you have [Redis AUTH][auth] enabled, specify the AUTH string here | -| database | int | false | The Redis database to connect to. Not applicable for cluster enabled instances. The default database is `0`. | -| tls.enabled | bool | false | Set it to `true` to enable TLS for the Redis connection. Defaults to `false`. | -| tls.insecureSkipVerify | bool | false | Set it to `true` to skip TLS certificate verification. **Warning:** This is insecure and not recommended for production. Defaults to `false`. | -| clusterEnabled | bool | false | Set it to `true` if using a Redis Cluster instance. Defaults to `false`. | -| useGCPIAM | bool | false | Set it to `true` if you are using GCP's IAM authentication. Defaults to `false`. | - -[auth]: https://cloud.google.com/memorystore/docs/redis/about-redis-auth +--- \ No newline at end of file diff --git a/docs/en/integrations/redis/source.md b/docs/en/integrations/redis/source.md new file mode 100644 index 000000000000..e2763098a79f --- /dev/null +++ b/docs/en/integrations/redis/source.md @@ -0,0 +1,108 @@ +--- +title: "Redis Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Redis is a in-memory data structure store. +no_list: true +--- + +## About + +Redis is a in-memory data structure store, used as a database, +cache, and message broker. It supports data structures such as strings, hashes, +lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, and +geospatial indexes with radius queries. + +If you are new to Redis, you can find installation and getting started guides on +the [official Redis website](https://redis.io/docs/). + +## Available Tools + +{{< list-tools >}} + +## Requirements + +## Example + +### Redis + +[AUTH string][auth] is a password for connection to Redis. If you have the +`requirepass` directive set in your Redis configuration, incoming client +connections must authenticate in order to connect. + +Specify your AUTH string in the password field: + +```yaml +kind: sources +name: my-redis-instance +type: redis +address: + - 127.0.0.1:6379 +username: ${MY_USER_NAME} +password: ${MY_AUTH_STRING} # Omit this field if you don't have a password. +# database: 0 +# clusterEnabled: false +# useGCPIAM: false +# tls: +# enabled: false +# insecureSkipVerify: false +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +### Memorystore For Redis + +Memorystore standalone instances support authentication using an [AUTH][auth] +string. + +Here is an example tools.yaml config with [AUTH][auth] enabled: + +```yaml +kind: sources +name: my-redis-cluster-instance +type: redis +address: + - 127.0.0.1:6379 +password: ${MY_AUTH_STRING} +# useGCPIAM: false +# clusterEnabled: false +``` + +Memorystore Redis Cluster supports IAM authentication instead. Grant your +account the required [IAM role][iam] and make sure to set `useGCPIAM` to `true`. + +Here is an example tools.yaml config for Memorystore Redis Cluster instances +using IAM authentication: + +```yaml +kind: sources +name: my-redis-cluster-instance +type: redis +address: + - 127.0.0.1:6379 +useGCPIAM: true +clusterEnabled: true +``` + +[iam]: https://cloud.google.com/memorystore/docs/cluster/about-iam-auth + +## Reference + +| **field** | **type** | **required** | **description** | +|------------------------|:--------:|:------------:|-----------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "redis". | +| address | string | true | Primary endpoint for the Memorystore Redis instance to connect to. | +| username | string | false | If you are using a non-default user, specify the user name here. If you are using Memorystore for Redis, leave this field blank | +| password | string | false | If you have [Redis AUTH][auth] enabled, specify the AUTH string here | +| database | int | false | The Redis database to connect to. Not applicable for cluster enabled instances. The default database is `0`. | +| tls.enabled | bool | false | Set it to `true` to enable TLS for the Redis connection. Defaults to `false`. | +| tls.insecureSkipVerify | bool | false | Set it to `true` to skip TLS certificate verification. **Warning:** This is insecure and not recommended for production. Defaults to `false`. | +| clusterEnabled | bool | false | Set it to `true` if using a Redis Cluster instance. Defaults to `false`. | +| useGCPIAM | bool | false | Set it to `true` if you are using GCP's IAM authentication. Defaults to `false`. | + +[auth]: https://cloud.google.com/memorystore/docs/redis/about-redis-auth diff --git a/docs/en/integrations/redis/tools/_index.md b/docs/en/integrations/redis/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/redis/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/redis/redis-tool.md b/docs/en/integrations/redis/tools/redis-tool.md similarity index 98% rename from docs/en/integrations/redis/redis-tool.md rename to docs/en/integrations/redis/tools/redis-tool.md index 097f640a7fdf..66845c3ce16a 100644 --- a/docs/en/integrations/redis/redis-tool.md +++ b/docs/en/integrations/redis/tools/redis-tool.md @@ -1,5 +1,5 @@ --- -title: "redis Tool" +title: "redis" type: docs weight: 1 description: > diff --git a/docs/en/integrations/serverless-spark/_index.md b/docs/en/integrations/serverless-spark/_index.md index 5df100fcf845..0a1bb3ca72ae 100644 --- a/docs/en/integrations/serverless-spark/_index.md +++ b/docs/en/integrations/serverless-spark/_index.md @@ -1,59 +1,4 @@ --- -title: "Serverless for Apache Spark Source" -type: docs +title: "Serverless for Apache Spark" weight: 1 -description: > - Google Cloud Serverless for Apache Spark lets you run Spark workloads without requiring you to provision and manage your own Spark cluster. -no_list: true ---- - -## About - -The [Serverless for Apache -Spark](https://cloud.google.com/dataproc-serverless/docs/overview) source allows -Toolbox to interact with Spark batches hosted on Google Cloud Serverless for -Apache Spark. - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### IAM Permissions - -Serverless for Apache Spark uses [Identity and Access Management -(IAM)](https://cloud.google.com/bigquery/docs/access-control) to control user -and group access to serverless Spark resources like batches and sessions. - -Toolbox will use your [Application Default Credentials -(ADC)](https://cloud.google.com/docs/authentication#adc) to authorize and -authenticate when interacting with Google Cloud Serverless for Apache Spark. -When using this method, you need to ensure the IAM identity associated with your -ADC has the correct -[permissions](https://cloud.google.com/dataproc-serverless/docs/concepts/iam) -for the actions you intend to perform. Common roles include -`roles/dataproc.serverlessEditor` (which includes permissions to run batches) or -`roles/dataproc.serverlessViewer`. Follow this -[guide](https://cloud.google.com/docs/authentication/provide-credentials-adc) to -set up your ADC. - -## Example - -```yaml -kind: sources -name: my-serverless-spark-source -type: serverless-spark -project: my-project-id -location: us-central1 -``` - -## Reference - -| **field** | **type** | **required** | **description** | -| --------- | :------: | :----------: | ----------------------------------------------------------------- | -| type | string | true | Must be "serverless-spark". | -| project | string | true | ID of the GCP project with Serverless for Apache Spark resources. | -| location | string | true | Location containing Serverless for Apache Spark resources. | +--- \ No newline at end of file diff --git a/docs/en/integrations/serverless-spark/source.md b/docs/en/integrations/serverless-spark/source.md new file mode 100644 index 000000000000..909a4812dad2 --- /dev/null +++ b/docs/en/integrations/serverless-spark/source.md @@ -0,0 +1,60 @@ +--- +title: "Serverless for Apache Spark Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Google Cloud Serverless for Apache Spark lets you run Spark workloads without requiring you to provision and manage your own Spark cluster. +no_list: true +--- + +## About + +The [Serverless for Apache +Spark](https://cloud.google.com/dataproc-serverless/docs/overview) source allows +Toolbox to interact with Spark batches hosted on Google Cloud Serverless for +Apache Spark. + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### IAM Permissions + +Serverless for Apache Spark uses [Identity and Access Management +(IAM)](https://cloud.google.com/bigquery/docs/access-control) to control user +and group access to serverless Spark resources like batches and sessions. + +Toolbox will use your [Application Default Credentials +(ADC)](https://cloud.google.com/docs/authentication#adc) to authorize and +authenticate when interacting with Google Cloud Serverless for Apache Spark. +When using this method, you need to ensure the IAM identity associated with your +ADC has the correct +[permissions](https://cloud.google.com/dataproc-serverless/docs/concepts/iam) +for the actions you intend to perform. Common roles include +`roles/dataproc.serverlessEditor` (which includes permissions to run batches) or +`roles/dataproc.serverlessViewer`. Follow this +[guide](https://cloud.google.com/docs/authentication/provide-credentials-adc) to +set up your ADC. + +## Example + +```yaml +kind: sources +name: my-serverless-spark-source +type: serverless-spark +project: my-project-id +location: us-central1 +``` + +## Reference + +| **field** | **type** | **required** | **description** | +| --------- | :------: | :----------: | ----------------------------------------------------------------- | +| type | string | true | Must be "serverless-spark". | +| project | string | true | ID of the GCP project with Serverless for Apache Spark resources. | +| location | string | true | Location containing Serverless for Apache Spark resources. | diff --git a/docs/en/integrations/serverless-spark/tools/_index.md b/docs/en/integrations/serverless-spark/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/serverless-spark/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/serverless-spark/serverless-spark-cancel-batch.md b/docs/en/integrations/serverless-spark/tools/serverless-spark-cancel-batch.md similarity index 97% rename from docs/en/integrations/serverless-spark/serverless-spark-cancel-batch.md rename to docs/en/integrations/serverless-spark/tools/serverless-spark-cancel-batch.md index 10c761bacb72..23eeef5f8f4a 100644 --- a/docs/en/integrations/serverless-spark/serverless-spark-cancel-batch.md +++ b/docs/en/integrations/serverless-spark/tools/serverless-spark-cancel-batch.md @@ -1,5 +1,5 @@ --- -title: "serverless-spark-cancel-batch Tool" +title: "serverless-spark-cancel-batch" type: docs weight: 2 description: > diff --git a/docs/en/integrations/serverless-spark/serverless-spark-create-pyspark-batch.md b/docs/en/integrations/serverless-spark/tools/serverless-spark-create-pyspark-batch.md similarity index 98% rename from docs/en/integrations/serverless-spark/serverless-spark-create-pyspark-batch.md rename to docs/en/integrations/serverless-spark/tools/serverless-spark-create-pyspark-batch.md index ecf78ef70f94..6e941f87ca0b 100644 --- a/docs/en/integrations/serverless-spark/serverless-spark-create-pyspark-batch.md +++ b/docs/en/integrations/serverless-spark/tools/serverless-spark-create-pyspark-batch.md @@ -1,5 +1,5 @@ --- -title: "serverless-spark-create-pyspark-batch Tool" +title: "serverless-spark-create-pyspark-batch" type: docs weight: 2 description: > diff --git a/docs/en/integrations/serverless-spark/serverless-spark-create-spark-batch.md b/docs/en/integrations/serverless-spark/tools/serverless-spark-create-spark-batch.md similarity index 98% rename from docs/en/integrations/serverless-spark/serverless-spark-create-spark-batch.md rename to docs/en/integrations/serverless-spark/tools/serverless-spark-create-spark-batch.md index b395b85bcfad..c2f42d5f5699 100644 --- a/docs/en/integrations/serverless-spark/serverless-spark-create-spark-batch.md +++ b/docs/en/integrations/serverless-spark/tools/serverless-spark-create-spark-batch.md @@ -1,5 +1,5 @@ --- -title: "serverless-spark-create-spark-batch Tool" +title: "serverless-spark-create-spark-batch" type: docs weight: 2 description: > diff --git a/docs/en/integrations/serverless-spark/serverless-spark-get-batch.md b/docs/en/integrations/serverless-spark/tools/serverless-spark-get-batch.md similarity index 98% rename from docs/en/integrations/serverless-spark/serverless-spark-get-batch.md rename to docs/en/integrations/serverless-spark/tools/serverless-spark-get-batch.md index bb14e4d4c127..a08de8b37c93 100644 --- a/docs/en/integrations/serverless-spark/serverless-spark-get-batch.md +++ b/docs/en/integrations/serverless-spark/tools/serverless-spark-get-batch.md @@ -1,5 +1,5 @@ --- -title: "serverless-spark-get-batch Tool" +title: "serverless-spark-get-batch" type: docs weight: 1 description: > diff --git a/docs/en/integrations/serverless-spark/serverless-spark-get-session-template.md b/docs/en/integrations/serverless-spark/tools/serverless-spark-get-session-template.md similarity index 100% rename from docs/en/integrations/serverless-spark/serverless-spark-get-session-template.md rename to docs/en/integrations/serverless-spark/tools/serverless-spark-get-session-template.md diff --git a/docs/en/integrations/serverless-spark/serverless-spark-list-batches.md b/docs/en/integrations/serverless-spark/tools/serverless-spark-list-batches.md similarity index 98% rename from docs/en/integrations/serverless-spark/serverless-spark-list-batches.md rename to docs/en/integrations/serverless-spark/tools/serverless-spark-list-batches.md index f5c90e9ab8a5..2476c6ea287d 100644 --- a/docs/en/integrations/serverless-spark/serverless-spark-list-batches.md +++ b/docs/en/integrations/serverless-spark/tools/serverless-spark-list-batches.md @@ -1,5 +1,5 @@ --- -title: "serverless-spark-list-batches Tool" +title: "serverless-spark-list-batches" type: docs weight: 1 description: > diff --git a/docs/en/integrations/singlestore/_index.md b/docs/en/integrations/singlestore/_index.md index 04302daaaddf..d949e90d963c 100644 --- a/docs/en/integrations/singlestore/_index.md +++ b/docs/en/integrations/singlestore/_index.md @@ -1,67 +1,4 @@ --- -title: "SingleStore Source" -type: docs +title: "SingleStore" weight: 1 -description: > - SingleStore is the cloud-native database built with speed and scale to power data-intensive applications. -no_list: true ---- - -## About - -[SingleStore][singlestore-docs] is a distributed SQL database built to power -intelligent applications. It is both relational and multi-model, enabling -developers to easily build and scale applications and workloads. - -SingleStore is built around Universal Storage which combines in-memory rowstore -and on-disk columnstore data formats to deliver a single table type that is -optimized to handle both transactional and analytical workloads. - -[singlestore-docs]: https://docs.singlestore.com/ - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source only uses standard authentication. You will need to [create a -database user][singlestore-user] to login to the database with. - -[singlestore-user]: - https://docs.singlestore.com/cloud/reference/sql-reference/security-management-commands/create-user/ - -## Example - -```yaml -kind: sources -name: my-singlestore-source -type: singlestore -host: 127.0.0.1 -port: 3306 -database: my_db -user: ${USER_NAME} -password: ${PASSWORD} -queryTimeout: 30s # Optional: query timeout duration -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|--------------|:--------:|:------------:|-------------------------------------------------------------------------------------------------| -| type | string | true | Must be "singlestore". | -| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | -| port | string | true | Port to connect to (e.g. "3306"). | -| database | string | true | Name of the SingleStore database to connect to (e.g. "my_db"). | -| user | string | true | Name of the SingleStore database user to connect as (e.g. "admin"). | -| password | string | true | Password of the SingleStore database user. | -| queryTimeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, no timeout is applied. | +--- \ No newline at end of file diff --git a/docs/en/integrations/singlestore/source.md b/docs/en/integrations/singlestore/source.md new file mode 100644 index 000000000000..768c6c0178f6 --- /dev/null +++ b/docs/en/integrations/singlestore/source.md @@ -0,0 +1,68 @@ +--- +title: "SingleStore Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + SingleStore is the cloud-native database built with speed and scale to power data-intensive applications. +no_list: true +--- + +## About + +[SingleStore][singlestore-docs] is a distributed SQL database built to power +intelligent applications. It is both relational and multi-model, enabling +developers to easily build and scale applications and workloads. + +SingleStore is built around Universal Storage which combines in-memory rowstore +and on-disk columnstore data formats to deliver a single table type that is +optimized to handle both transactional and analytical workloads. + +[singlestore-docs]: https://docs.singlestore.com/ + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source only uses standard authentication. You will need to [create a +database user][singlestore-user] to login to the database with. + +[singlestore-user]: + https://docs.singlestore.com/cloud/reference/sql-reference/security-management-commands/create-user/ + +## Example + +```yaml +kind: sources +name: my-singlestore-source +type: singlestore +host: 127.0.0.1 +port: 3306 +database: my_db +user: ${USER_NAME} +password: ${PASSWORD} +queryTimeout: 30s # Optional: query timeout duration +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|--------------|:--------:|:------------:|-------------------------------------------------------------------------------------------------| +| type | string | true | Must be "singlestore". | +| host | string | true | IP address to connect to (e.g. "127.0.0.1"). | +| port | string | true | Port to connect to (e.g. "3306"). | +| database | string | true | Name of the SingleStore database to connect to (e.g. "my_db"). | +| user | string | true | Name of the SingleStore database user to connect as (e.g. "admin"). | +| password | string | true | Password of the SingleStore database user. | +| queryTimeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, no timeout is applied. | diff --git a/docs/en/integrations/singlestore/tools/_index.md b/docs/en/integrations/singlestore/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/singlestore/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/singlestore/singlestore-execute-sql.md b/docs/en/integrations/singlestore/tools/singlestore-execute-sql.md similarity index 96% rename from docs/en/integrations/singlestore/singlestore-execute-sql.md rename to docs/en/integrations/singlestore/tools/singlestore-execute-sql.md index e57ddbfc8f6e..65ded093340d 100644 --- a/docs/en/integrations/singlestore/singlestore-execute-sql.md +++ b/docs/en/integrations/singlestore/tools/singlestore-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "singlestore-execute-sql Tool" +title: "singlestore-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/singlestore/singlestore-sql.md b/docs/en/integrations/singlestore/tools/singlestore-sql.md similarity index 99% rename from docs/en/integrations/singlestore/singlestore-sql.md rename to docs/en/integrations/singlestore/tools/singlestore-sql.md index 120f8746cbca..1427cd79c506 100644 --- a/docs/en/integrations/singlestore/singlestore-sql.md +++ b/docs/en/integrations/singlestore/tools/singlestore-sql.md @@ -1,5 +1,5 @@ --- -title: "singlestore-sql Tool" +title: "singlestore-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/snowflake/_index.md b/docs/en/integrations/snowflake/_index.md index 77d746e445a6..06b02e939dcc 100644 --- a/docs/en/integrations/snowflake/_index.md +++ b/docs/en/integrations/snowflake/_index.md @@ -1,61 +1,4 @@ --- -title: "Snowflake Source" -type: docs +title: "Snowflake" weight: 1 -description: > - Snowflake is a cloud-based data platform. -no_list: true ---- - -## About - -[Snowflake][sf-docs] is a cloud data platform that provides a data warehouse-as-a-service designed for the cloud. - -[sf-docs]: https://docs.snowflake.com/ - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source only uses standard authentication. You will need to create a -Snowflake user to login to the database with. - -## Example - -```yaml -kind: sources -name: my-sf-source -type: snowflake -account: ${SNOWFLAKE_ACCOUNT} -user: ${SNOWFLAKE_USER} -password: ${SNOWFLAKE_PASSWORD} -database: ${SNOWFLAKE_DATABASE} -schema: ${SNOWFLAKE_SCHEMA} -warehouse: ${SNOWFLAKE_WAREHOUSE} -role: ${SNOWFLAKE_ROLE} -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|------------------------------------------------------------------------| -| type | string | true | Must be "snowflake". | -| account | string | true | Your Snowflake account identifier. | -| user | string | true | Name of the Snowflake user to connect as (e.g. "my-sf-user"). | -| password | string | true | Password of the Snowflake user (e.g. "my-password"). | -| database | string | true | Name of the Snowflake database to connect to (e.g. "my_db"). | -| schema | string | true | Name of the schema to use (e.g. "my_schema"). | -| warehouse | string | false | The virtual warehouse to use. Defaults to "COMPUTE_WH". | -| role | string | false | The security role to use. Defaults to "ACCOUNTADMIN". | -| timeout | integer | false | The connection timeout in seconds. Defaults to 60. | \ No newline at end of file +--- \ No newline at end of file diff --git a/docs/en/integrations/snowflake/samples/_index.md b/docs/en/integrations/snowflake/samples/_index.md new file mode 100644 index 000000000000..e9548b273e4a --- /dev/null +++ b/docs/en/integrations/snowflake/samples/_index.md @@ -0,0 +1,4 @@ +--- +title: "Samples" +weight: 3 +--- diff --git a/docs/en/build-with-mcp-toolbox/snowflake/runme.py b/docs/en/integrations/snowflake/samples/runme.py similarity index 100% rename from docs/en/build-with-mcp-toolbox/snowflake/runme.py rename to docs/en/integrations/snowflake/samples/runme.py diff --git a/docs/en/build-with-mcp-toolbox/snowflake/_index.md b/docs/en/integrations/snowflake/samples/sample.md similarity index 89% rename from docs/en/build-with-mcp-toolbox/snowflake/_index.md rename to docs/en/integrations/snowflake/samples/sample.md index 3c029abfd3a9..080ad9b57425 100644 --- a/docs/en/build-with-mcp-toolbox/snowflake/_index.md +++ b/docs/en/integrations/snowflake/samples/sample.md @@ -4,13 +4,15 @@ type: docs weight: 7 description: > How to get started running Toolbox with MCP Inspector and Snowflake as the source. +sample_filters: ["Snowflake", "MCP Inspector"] +is_sample: true --- ## Overview [Model Context Protocol](https://modelcontextprotocol.io) is an open protocol that standardizes how applications provide context to LLMs. Check out this page -on how to [connect to Toolbox via MCP](../../user-guide/connect-to/mcp-client/_index.md). +on how to [connect to Toolbox via MCP](../../../documentation/connect-to/mcp-client/_index.md). ## Before you begin @@ -109,7 +111,7 @@ statement: | ``` For more info on tools, check out the -[Tools](../../user-guide/configuration/tools/_index.md) section. +[Tools](../../../documentation/configuration/tools/_index.md) section. ## Step 4: Run the Toolbox server @@ -157,6 +159,6 @@ Run the Toolbox server, pointing to the `tools.yaml` file created earlier: ## What's next -- Learn more about [MCP Inspector](../../user-guide/connect-to/mcp-client/_index.md). -- Learn more about [Toolbox User Guide](../../user-guide/configuration/_index.md). -- Learn more about [Toolbox Tutorials](../../build-with-mcp-toolbox/_index.md). +- Learn more about [MCP Inspector](../../../documentation/connect-to/mcp-client/_index.md). +- Learn more about [Toolbox User Guide](../../../documentation/configuration/_index.md). +- Learn more about [Toolbox Tutorials](../../../samples-hub/_index.md). diff --git a/docs/en/build-with-mcp-toolbox/snowflake/snowflake-config.yaml b/docs/en/integrations/snowflake/samples/snowflake-config.yaml similarity index 100% rename from docs/en/build-with-mcp-toolbox/snowflake/snowflake-config.yaml rename to docs/en/integrations/snowflake/samples/snowflake-config.yaml diff --git a/docs/en/build-with-mcp-toolbox/snowflake/snowflake-env.sh b/docs/en/integrations/snowflake/samples/snowflake-env.sh similarity index 91% rename from docs/en/build-with-mcp-toolbox/snowflake/snowflake-env.sh rename to docs/en/integrations/snowflake/samples/snowflake-env.sh index f7a027c99f3e..f44a5cccfe5a 100644 --- a/docs/en/build-with-mcp-toolbox/snowflake/snowflake-env.sh +++ b/docs/en/integrations/snowflake/samples/snowflake-env.sh @@ -25,4 +25,4 @@ echo "Role: $SNOWFLAKE_ROLE" echo "" echo "You can now run the toolbox with:" echo " ./toolbox --prebuilt snowflake # Use prebuilt configuration" -echo " ./toolbox --tools-file docs/en/build-with-mcp-toolbox/snowflake/snowflake-config.yaml # Use custom configuration" +echo " ./toolbox --tools-file docs/en/integrations/snowflake/samples/snowflake-config.yaml # Use custom configuration" diff --git a/docs/en/build-with-mcp-toolbox/snowflake/test-snowflake.sh b/docs/en/integrations/snowflake/samples/test-snowflake.sh similarity index 82% rename from docs/en/build-with-mcp-toolbox/snowflake/test-snowflake.sh rename to docs/en/integrations/snowflake/samples/test-snowflake.sh index 3fb8c9ec76ea..be530c225b86 100644 --- a/docs/en/build-with-mcp-toolbox/snowflake/test-snowflake.sh +++ b/docs/en/integrations/snowflake/samples/test-snowflake.sh @@ -38,19 +38,19 @@ timeout 5s ./toolbox --prebuilt snowflake --stdio 2>&1 | head -5 echo "" echo "=== Testing Custom Configuration ===" echo "This will attempt to initialize with the custom Snowflake configuration:" -echo "Command: ./toolbox --tools-file docs/en/build-with-mcp-toolbox/snowflake/snowflake-config.yaml --stdio" +echo "Command: ./toolbox --tools-file docs/en/integrations/snowflake/samples/snowflake-config.yaml --stdio" echo "" echo "Expected result: Connection failure due to test credentials (this is normal)" echo "" # Test the custom configuration (this will fail with test credentials, which is expected) -timeout 5s ./toolbox --tools-file docs/en/build-with-mcp-toolbox/snowflake/snowflake-config.yaml --stdio 2>&1 | head -5 +timeout 5s ./toolbox --tools-file docs/en/integrations/snowflake/samples/snowflake-config.yaml --stdio 2>&1 | head -5 echo "" echo "=== Instructions for Real Usage ===" -echo "1. Copy docs/en/build-with-mcp-toolbox/snowflake/snowflake-env.sh to your own file" +echo "1. Copy docs/en/integrations/snowflake/samples/snowflake-env.sh to your own file" echo "2. Edit it with your actual Snowflake credentials" echo "3. Source the file: source your-snowflake-env.sh" echo "4. Run: ./toolbox --prebuilt snowflake" echo "" -echo "For more information, see docs/en/build-with-mcp-toolbox/snowflake" +echo "For more information, see docs/en/integrations/snowflake/samples" diff --git a/docs/en/integrations/snowflake/source.md b/docs/en/integrations/snowflake/source.md new file mode 100644 index 000000000000..2c282685ea2a --- /dev/null +++ b/docs/en/integrations/snowflake/source.md @@ -0,0 +1,62 @@ +--- +title: "Snowflake Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Snowflake is a cloud-based data platform. +no_list: true +--- + +## About + +[Snowflake][sf-docs] is a cloud data platform that provides a data warehouse-as-a-service designed for the cloud. + +[sf-docs]: https://docs.snowflake.com/ + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source only uses standard authentication. You will need to create a +Snowflake user to login to the database with. + +## Example + +```yaml +kind: sources +name: my-sf-source +type: snowflake +account: ${SNOWFLAKE_ACCOUNT} +user: ${SNOWFLAKE_USER} +password: ${SNOWFLAKE_PASSWORD} +database: ${SNOWFLAKE_DATABASE} +schema: ${SNOWFLAKE_SCHEMA} +warehouse: ${SNOWFLAKE_WAREHOUSE} +role: ${SNOWFLAKE_ROLE} +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|------------------------------------------------------------------------| +| type | string | true | Must be "snowflake". | +| account | string | true | Your Snowflake account identifier. | +| user | string | true | Name of the Snowflake user to connect as (e.g. "my-sf-user"). | +| password | string | true | Password of the Snowflake user (e.g. "my-password"). | +| database | string | true | Name of the Snowflake database to connect to (e.g. "my_db"). | +| schema | string | true | Name of the schema to use (e.g. "my_schema"). | +| warehouse | string | false | The virtual warehouse to use. Defaults to "COMPUTE_WH". | +| role | string | false | The security role to use. Defaults to "ACCOUNTADMIN". | +| timeout | integer | false | The connection timeout in seconds. Defaults to 60. | \ No newline at end of file diff --git a/docs/en/integrations/snowflake/tools/_index.md b/docs/en/integrations/snowflake/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/snowflake/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/snowflake/snowflake-execute-sql.md b/docs/en/integrations/snowflake/tools/snowflake-execute-sql.md similarity index 97% rename from docs/en/integrations/snowflake/snowflake-execute-sql.md rename to docs/en/integrations/snowflake/tools/snowflake-execute-sql.md index 131d5e35b6c2..a6f7e11b3c24 100644 --- a/docs/en/integrations/snowflake/snowflake-execute-sql.md +++ b/docs/en/integrations/snowflake/tools/snowflake-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "snowflake-execute-sql Tool" +title: "snowflake-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/snowflake/snowflake-sql.md b/docs/en/integrations/snowflake/tools/snowflake-sql.md similarity index 99% rename from docs/en/integrations/snowflake/snowflake-sql.md rename to docs/en/integrations/snowflake/tools/snowflake-sql.md index fd5c2c5fb12a..f9b08f18055f 100644 --- a/docs/en/integrations/snowflake/snowflake-sql.md +++ b/docs/en/integrations/snowflake/tools/snowflake-sql.md @@ -1,5 +1,5 @@ --- -title: "snowflake-sql Tool" +title: "snowflake-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/spanner/_index.md b/docs/en/integrations/spanner/_index.md index c47ba239cd0f..d9c38691e729 100644 --- a/docs/en/integrations/spanner/_index.md +++ b/docs/en/integrations/spanner/_index.md @@ -1,76 +1,4 @@ --- -title: "Spanner Source" -type: docs +title: "Spanner" weight: 1 -description: > - Spanner is a fully managed database service from Google Cloud that combines - relational, key-value, graph, and search capabilities. -no_list: true ---- - -## About - -[Spanner][spanner-docs] is a fully managed, mission-critical database service -that brings together relational, graph, key-value, and search. It offers -transactional consistency at global scale, automatic, synchronous replication -for high availability, and support for two SQL dialects: GoogleSQL (ANSI 2011 -with extensions) and PostgreSQL. - -If you are new to Spanner, you can try to [create and query a database using -the Google Cloud console][spanner-quickstart]. - -[spanner-docs]: https://cloud.google.com/spanner/docs -[spanner-quickstart]: - https://cloud.google.com/spanner/docs/create-query-database-console - - - -## Available Tools - -{{< list-tools >}} - -### Pre-built Configurations - -- [Spanner using MCP](../../user-guide/connect-to/ides/spanner_mcp.md) -Connect your IDE to Spanner using Toolbox. - -## Requirements - -### IAM Permissions - -Spanner uses [Identity and Access Management (IAM)][iam-overview] to control -user and group access to Spanner resources at the project, Spanner instance, and -Spanner database levels. Toolbox will use your [Application Default Credentials -(ADC)][adc] to authorize and authenticate when interacting with Spanner. - -In addition to [setting the ADC for your server][set-adc], you need to ensure -the IAM identity has been given the correct IAM permissions for the query -provided. See [Apply IAM roles][grant-permissions] for more information on -applying IAM permissions and roles to an identity. - -[iam-overview]: https://cloud.google.com/spanner/docs/iam -[adc]: https://cloud.google.com/docs/authentication#adc -[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc -[grant-permissions]: https://cloud.google.com/spanner/docs/grant-permissions - -## Example - -```yaml -kind: sources -name: my-spanner-source -type: "spanner" -project: "my-project-id" -instance: "my-instance" -database: "my_db" -# dialect: "googlesql" -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|---------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "spanner". | -| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | -| instance | string | true | Name of the Spanner instance. | -| database | string | true | Name of the database on the Spanner instance | -| dialect | string | false | Name of the dialect type of the Spanner database, must be either `googlesql` or `postgresql`. Default: `googlesql`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/spanner/source.md b/docs/en/integrations/spanner/source.md new file mode 100644 index 000000000000..fa26f7f8e65e --- /dev/null +++ b/docs/en/integrations/spanner/source.md @@ -0,0 +1,77 @@ +--- +title: "Spanner Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Spanner is a fully managed database service from Google Cloud that combines + relational, key-value, graph, and search capabilities. +no_list: true +--- + +## About + +[Spanner][spanner-docs] is a fully managed, mission-critical database service +that brings together relational, graph, key-value, and search. It offers +transactional consistency at global scale, automatic, synchronous replication +for high availability, and support for two SQL dialects: GoogleSQL (ANSI 2011 +with extensions) and PostgreSQL. + +If you are new to Spanner, you can try to [create and query a database using +the Google Cloud console][spanner-quickstart]. + +[spanner-docs]: https://cloud.google.com/spanner/docs +[spanner-quickstart]: + https://cloud.google.com/spanner/docs/create-query-database-console + + + +## Available Tools + +{{< list-tools >}} + +### Pre-built Configurations + +- [Spanner using MCP](../../documentation/connect-to/ides/spanner_mcp.md) +Connect your IDE to Spanner using Toolbox. + +## Requirements + +### IAM Permissions + +Spanner uses [Identity and Access Management (IAM)][iam-overview] to control +user and group access to Spanner resources at the project, Spanner instance, and +Spanner database levels. Toolbox will use your [Application Default Credentials +(ADC)][adc] to authorize and authenticate when interacting with Spanner. + +In addition to [setting the ADC for your server][set-adc], you need to ensure +the IAM identity has been given the correct IAM permissions for the query +provided. See [Apply IAM roles][grant-permissions] for more information on +applying IAM permissions and roles to an identity. + +[iam-overview]: https://cloud.google.com/spanner/docs/iam +[adc]: https://cloud.google.com/docs/authentication#adc +[set-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc +[grant-permissions]: https://cloud.google.com/spanner/docs/grant-permissions + +## Example + +```yaml +kind: sources +name: my-spanner-source +type: "spanner" +project: "my-project-id" +instance: "my-instance" +database: "my_db" +# dialect: "googlesql" +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|---------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "spanner". | +| project | string | true | Id of the GCP project that the cluster was created in (e.g. "my-project-id"). | +| instance | string | true | Name of the Spanner instance. | +| database | string | true | Name of the database on the Spanner instance | +| dialect | string | false | Name of the dialect type of the Spanner database, must be either `googlesql` or `postgresql`. Default: `googlesql`. | diff --git a/docs/en/integrations/spanner/tools/_index.md b/docs/en/integrations/spanner/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/spanner/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/spanner/spanner-execute-sql.md b/docs/en/integrations/spanner/tools/spanner-execute-sql.md similarity index 97% rename from docs/en/integrations/spanner/spanner-execute-sql.md rename to docs/en/integrations/spanner/tools/spanner-execute-sql.md index cd865f725804..c506dc0d6000 100644 --- a/docs/en/integrations/spanner/spanner-execute-sql.md +++ b/docs/en/integrations/spanner/tools/spanner-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "spanner-execute-sql Tool" +title: "spanner-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/spanner/spanner-list-graphs.md b/docs/en/integrations/spanner/tools/spanner-list-graphs.md similarity index 99% rename from docs/en/integrations/spanner/spanner-list-graphs.md rename to docs/en/integrations/spanner/tools/spanner-list-graphs.md index 89f346be9a88..1117c69d4598 100644 --- a/docs/en/integrations/spanner/spanner-list-graphs.md +++ b/docs/en/integrations/spanner/tools/spanner-list-graphs.md @@ -1,5 +1,5 @@ --- -title: "spanner-list-graphs Tool" +title: "spanner-list-graphs" type: docs weight: 3 description: > diff --git a/docs/en/integrations/spanner/spanner-list-tables.md b/docs/en/integrations/spanner/tools/spanner-list-tables.md similarity index 99% rename from docs/en/integrations/spanner/spanner-list-tables.md rename to docs/en/integrations/spanner/tools/spanner-list-tables.md index a8a8e46d5755..aa78c7a7414a 100644 --- a/docs/en/integrations/spanner/spanner-list-tables.md +++ b/docs/en/integrations/spanner/tools/spanner-list-tables.md @@ -1,5 +1,5 @@ --- -title: "spanner-list-tables Tool" +title: "spanner-list-tables" type: docs weight: 3 description: > diff --git a/docs/en/integrations/spanner/spanner-sql.md b/docs/en/integrations/spanner/tools/spanner-sql.md similarity index 99% rename from docs/en/integrations/spanner/spanner-sql.md rename to docs/en/integrations/spanner/tools/spanner-sql.md index 89afccad127e..3dd7d8380601 100644 --- a/docs/en/integrations/spanner/spanner-sql.md +++ b/docs/en/integrations/spanner/tools/spanner-sql.md @@ -1,5 +1,5 @@ --- -title: "spanner-sql Tool" +title: "spanner-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/sqlite/_index.md b/docs/en/integrations/sqlite/_index.md index 9f6f9c8490f2..287710dc338f 100644 --- a/docs/en/integrations/sqlite/_index.md +++ b/docs/en/integrations/sqlite/_index.md @@ -1,79 +1,4 @@ --- -title: "SQLite Source" -linkTitle: "SQLite" -type: docs +title: "SQLite" weight: 1 -description: > - SQLite is a C-language library that implements a small, fast, self-contained, - high-reliability, full-featured, SQL database engine. -no_list: true ---- - -## About - -[SQLite](https://sqlite.org/) is a software library that provides a relational -database management system. The lite in SQLite means lightweight in terms of -setup, database administration, and required resources. - -SQLite has the following notable characteristics: - -- Self-contained with no external dependencies -- Serverless - the SQLite library accesses its storage files directly -- Single database file that can be easily copied or moved -- Zero-configuration - no setup or administration needed -- Transactional with ACID properties - - - -## Available Tools - -{{< list-tools >}} - -### Pre-built Configurations - -- [SQLite using MCP](../../user-guide/connect-to/ides/sqlite_mcp.md) -Connect your IDE to SQlite using Toolbox. - -## Requirements - -### Database File - -You need a SQLite database file. This can be: - -- An existing database file -- A path where a new database file should be created -- `:memory:` for an in-memory database - -## Example - -```yaml -kind: sources -name: my-sqlite-db -type: "sqlite" -database: "/path/to/database.db" -``` - -For an in-memory database: - -```yaml -kind: sources -name: my-sqlite-memory-db -type: "sqlite" -database: ":memory:" -``` - -## Reference - -### Configuration Fields - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|---------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "sqlite". | -| database | string | true | Path to SQLite database file, or ":memory:" for an in-memory database. | - -### Connection Properties - -SQLite connections are configured with these defaults for optimal performance: - -- `MaxOpenConns`: 1 (SQLite only supports one writer at a time) -- `MaxIdleConns`: 1 +--- \ No newline at end of file diff --git a/docs/en/integrations/sqlite/source.md b/docs/en/integrations/sqlite/source.md new file mode 100644 index 000000000000..54c87c6c489c --- /dev/null +++ b/docs/en/integrations/sqlite/source.md @@ -0,0 +1,79 @@ +--- +title: "SQLite Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + SQLite is a C-language library that implements a small, fast, self-contained, + high-reliability, full-featured, SQL database engine. +no_list: true +--- + +## About + +[SQLite](https://sqlite.org/) is a software library that provides a relational +database management system. The lite in SQLite means lightweight in terms of +setup, database administration, and required resources. + +SQLite has the following notable characteristics: + +- Self-contained with no external dependencies +- Serverless - the SQLite library accesses its storage files directly +- Single database file that can be easily copied or moved +- Zero-configuration - no setup or administration needed +- Transactional with ACID properties + + + +## Available Tools + +{{< list-tools >}} + +### Pre-built Configurations + +- [SQLite using MCP](../../documentation/connect-to/ides/sqlite_mcp.md) +Connect your IDE to SQlite using Toolbox. + +## Requirements + +### Database File + +You need a SQLite database file. This can be: + +- An existing database file +- A path where a new database file should be created +- `:memory:` for an in-memory database + +## Example + +```yaml +kind: sources +name: my-sqlite-db +type: "sqlite" +database: "/path/to/database.db" +``` + +For an in-memory database: + +```yaml +kind: sources +name: my-sqlite-memory-db +type: "sqlite" +database: ":memory:" +``` + +## Reference + +### Configuration Fields + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|---------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "sqlite". | +| database | string | true | Path to SQLite database file, or ":memory:" for an in-memory database. | + +### Connection Properties + +SQLite connections are configured with these defaults for optimal performance: + +- `MaxOpenConns`: 1 (SQLite only supports one writer at a time) +- `MaxIdleConns`: 1 diff --git a/docs/en/integrations/sqlite/tools/_index.md b/docs/en/integrations/sqlite/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/sqlite/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/sqlite/sqlite-execute-sql.md b/docs/en/integrations/sqlite/tools/sqlite-execute-sql.md similarity index 97% rename from docs/en/integrations/sqlite/sqlite-execute-sql.md rename to docs/en/integrations/sqlite/tools/sqlite-execute-sql.md index 0b3595d455c4..d55896299872 100644 --- a/docs/en/integrations/sqlite/sqlite-execute-sql.md +++ b/docs/en/integrations/sqlite/tools/sqlite-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "sqlite-execute-sql Tool" +title: "sqlite-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/sqlite/sqlite-sql.md b/docs/en/integrations/sqlite/tools/sqlite-sql.md similarity index 99% rename from docs/en/integrations/sqlite/sqlite-sql.md rename to docs/en/integrations/sqlite/tools/sqlite-sql.md index 58bb3f0abb04..8a01251c5af9 100644 --- a/docs/en/integrations/sqlite/sqlite-sql.md +++ b/docs/en/integrations/sqlite/tools/sqlite-sql.md @@ -1,5 +1,5 @@ --- -title: "sqlite-sql Tool" +title: "sqlite-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/tidb/_index.md b/docs/en/integrations/tidb/_index.md index d2b16f979326..522407f75e4f 100644 --- a/docs/en/integrations/tidb/_index.md +++ b/docs/en/integrations/tidb/_index.md @@ -1,96 +1,4 @@ --- -title: "TiDB Source" -type: docs +title: "TiDB" weight: 1 -description: > - TiDB is a distributed SQL database that combines the best of traditional RDBMS and NoSQL databases. -no_list: true ---- - -## About - -[TiDB][tidb-docs] is an open-source distributed SQL database that supports -Hybrid Transactional and Analytical Processing (HTAP) workloads. It is -MySQL-compatible and features horizontal scalability, strong consistency, and -high availability. - -[tidb-docs]: https://docs.pingcap.com/tidb/stable - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Database User - -This source uses standard MySQL protocol authentication. You will need to -[create a TiDB user][tidb-users] to login to the database with. - -For TiDB Cloud users, you can create database users through the TiDB Cloud -console. - -[tidb-users]: https://docs.pingcap.com/tidb/stable/user-account-management - -## Example - -- TiDB Cloud - - ```yaml - kind: sources - name: my-tidb-cloud-source - type: tidb - host: gateway01.us-west-2.prod.aws.tidbcloud.com - port: 4000 - database: my_db - user: ${TIDB_USERNAME} - password: ${TIDB_PASSWORD} - # SSL is automatically enabled for TiDB Cloud - ``` - -- Self-Hosted TiDB - - ```yaml - kind: sources - name: my-tidb-source - type: tidb - host: 127.0.0.1 - port: 4000 - database: my_db - user: ${TIDB_USERNAME} - password: ${TIDB_PASSWORD} - # ssl: true # Optional: enable SSL for secure connections - ``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -|-----------|:--------:|:------------:|--------------------------------------------------------------------------------------------| -| type | string | true | Must be "tidb". | -| host | string | true | IP address or hostname to connect to (e.g. "127.0.0.1" or "gateway01.*.tidbcloud.com"). | -| port | string | true | Port to connect to (typically "4000" for TiDB). | -| database | string | true | Name of the TiDB database to connect to (e.g. "my_db"). | -| user | string | true | Name of the TiDB user to connect as (e.g. "my-tidb-user"). | -| password | string | true | Password of the TiDB user (e.g. "my-password"). | -| ssl | boolean | false | Whether to use SSL/TLS encryption. Automatically enabled for TiDB Cloud instances. | - -## Advanced Usage - -### SSL Configuration - -- TiDB Cloud - - For TiDB Cloud instances, SSL is automatically enabled when the hostname - matches the TiDB Cloud pattern (`gateway*.*.*.tidbcloud.com`). You don't - need to explicitly set `ssl: true` for TiDB Cloud connections. - -- Self-Hosted TiDB - - For self-hosted TiDB instances, you can optionally enable SSL by setting - `ssl: true` in your configuration. \ No newline at end of file +--- \ No newline at end of file diff --git a/docs/en/integrations/tidb/source.md b/docs/en/integrations/tidb/source.md new file mode 100644 index 000000000000..9e9ef17d3b4f --- /dev/null +++ b/docs/en/integrations/tidb/source.md @@ -0,0 +1,97 @@ +--- +title: "TiDB Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + TiDB is a distributed SQL database that combines the best of traditional RDBMS and NoSQL databases. +no_list: true +--- + +## About + +[TiDB][tidb-docs] is an open-source distributed SQL database that supports +Hybrid Transactional and Analytical Processing (HTAP) workloads. It is +MySQL-compatible and features horizontal scalability, strong consistency, and +high availability. + +[tidb-docs]: https://docs.pingcap.com/tidb/stable + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Database User + +This source uses standard MySQL protocol authentication. You will need to +[create a TiDB user][tidb-users] to login to the database with. + +For TiDB Cloud users, you can create database users through the TiDB Cloud +console. + +[tidb-users]: https://docs.pingcap.com/tidb/stable/user-account-management + +## Example + +- TiDB Cloud + + ```yaml + kind: sources + name: my-tidb-cloud-source + type: tidb + host: gateway01.us-west-2.prod.aws.tidbcloud.com + port: 4000 + database: my_db + user: ${TIDB_USERNAME} + password: ${TIDB_PASSWORD} + # SSL is automatically enabled for TiDB Cloud + ``` + +- Self-Hosted TiDB + + ```yaml + kind: sources + name: my-tidb-source + type: tidb + host: 127.0.0.1 + port: 4000 + database: my_db + user: ${TIDB_USERNAME} + password: ${TIDB_PASSWORD} + # ssl: true # Optional: enable SSL for secure connections + ``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +|-----------|:--------:|:------------:|--------------------------------------------------------------------------------------------| +| type | string | true | Must be "tidb". | +| host | string | true | IP address or hostname to connect to (e.g. "127.0.0.1" or "gateway01.*.tidbcloud.com"). | +| port | string | true | Port to connect to (typically "4000" for TiDB). | +| database | string | true | Name of the TiDB database to connect to (e.g. "my_db"). | +| user | string | true | Name of the TiDB user to connect as (e.g. "my-tidb-user"). | +| password | string | true | Password of the TiDB user (e.g. "my-password"). | +| ssl | boolean | false | Whether to use SSL/TLS encryption. Automatically enabled for TiDB Cloud instances. | + +## Advanced Usage + +### SSL Configuration + +- TiDB Cloud + + For TiDB Cloud instances, SSL is automatically enabled when the hostname + matches the TiDB Cloud pattern (`gateway*.*.*.tidbcloud.com`). You don't + need to explicitly set `ssl: true` for TiDB Cloud connections. + +- Self-Hosted TiDB + + For self-hosted TiDB instances, you can optionally enable SSL by setting + `ssl: true` in your configuration. \ No newline at end of file diff --git a/docs/en/integrations/tidb/tools/_index.md b/docs/en/integrations/tidb/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/tidb/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/tidb/tidb-execute-sql.md b/docs/en/integrations/tidb/tools/tidb-execute-sql.md similarity index 97% rename from docs/en/integrations/tidb/tidb-execute-sql.md rename to docs/en/integrations/tidb/tools/tidb-execute-sql.md index 39ee389ef99b..6b952341daba 100644 --- a/docs/en/integrations/tidb/tidb-execute-sql.md +++ b/docs/en/integrations/tidb/tools/tidb-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "tidb-execute-sql Tool" +title: "tidb-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/tidb/tidb-sql.md b/docs/en/integrations/tidb/tools/tidb-sql.md similarity index 99% rename from docs/en/integrations/tidb/tidb-sql.md rename to docs/en/integrations/tidb/tools/tidb-sql.md index e903698f77be..5dd050dfb375 100644 --- a/docs/en/integrations/tidb/tidb-sql.md +++ b/docs/en/integrations/tidb/tools/tidb-sql.md @@ -1,5 +1,5 @@ --- -title: "tidb-sql Tool" +title: "tidb-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/trino/_index.md b/docs/en/integrations/trino/_index.md index 99b1230cab58..df8186d5ad01 100644 --- a/docs/en/integrations/trino/_index.md +++ b/docs/en/integrations/trino/_index.md @@ -1,67 +1,4 @@ --- -title: "Trino Source" -type: docs +title: "Trino" weight: 1 -description: > - Trino is a distributed SQL query engine for big data analytics. -no_list: true ---- - -## About - -[Trino][trino-docs] is a distributed SQL query engine designed for fast analytic -queries against data of any size. It allows you to query data where it lives, -including Hive, Cassandra, relational databases or even proprietary data stores. - -[trino-docs]: https://trino.io/docs/ - - - -## Available Tools - -{{< list-tools >}} - -## Requirements - -### Trino Cluster - -You need access to a running Trino cluster with appropriate user permissions for -the catalogs and schemas you want to query. - -## Example - -```yaml -kind: sources -name: my-trino-source -type: trino -host: trino.example.com -port: "8080" -user: ${TRINO_USER} # Optional for anonymous access -password: ${TRINO_PASSWORD} # Optional -catalog: hive -schema: default -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -## Reference - -| **field** | **type** | **required** | **description** | -| ---------------------- | :------: | :----------: | ---------------------------------------------------------------------------- | -| type | string | true | Must be "trino". | -| host | string | true | Trino coordinator hostname (e.g. "trino.example.com") | -| port | string | true | Trino coordinator port (e.g. "8080", "8443") | -| user | string | false | Username for authentication (e.g. "analyst"). Optional for anonymous access. | -| password | string | false | Password for basic authentication | -| catalog | string | true | Default catalog to use for queries (e.g. "hive") | -| schema | string | true | Default schema to use for queries (e.g. "default") | -| queryTimeout | string | false | Query timeout duration (e.g. "30m", "1h") | -| accessToken | string | false | JWT access token for authentication | -| kerberosEnabled | boolean | false | Enable Kerberos authentication (default: false) | -| sslEnabled | boolean | false | Enable SSL/TLS (default: false) | -| disableSslVerification | boolean | false | Skip SSL/TLS certificate verification (default: false) | -| sslCertPath | string | false | Path to a custom SSL/TLS certificate file | -| sslCert | string | false | Custom SSL/TLS certificate content | +--- \ No newline at end of file diff --git a/docs/en/integrations/trino/source.md b/docs/en/integrations/trino/source.md new file mode 100644 index 000000000000..f25e4c4a1497 --- /dev/null +++ b/docs/en/integrations/trino/source.md @@ -0,0 +1,68 @@ +--- +title: "Trino Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Trino is a distributed SQL query engine for big data analytics. +no_list: true +--- + +## About + +[Trino][trino-docs] is a distributed SQL query engine designed for fast analytic +queries against data of any size. It allows you to query data where it lives, +including Hive, Cassandra, relational databases or even proprietary data stores. + +[trino-docs]: https://trino.io/docs/ + + + +## Available Tools + +{{< list-tools >}} + +## Requirements + +### Trino Cluster + +You need access to a running Trino cluster with appropriate user permissions for +the catalogs and schemas you want to query. + +## Example + +```yaml +kind: sources +name: my-trino-source +type: trino +host: trino.example.com +port: "8080" +user: ${TRINO_USER} # Optional for anonymous access +password: ${TRINO_PASSWORD} # Optional +catalog: hive +schema: default +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +## Reference + +| **field** | **type** | **required** | **description** | +| ---------------------- | :------: | :----------: | ---------------------------------------------------------------------------- | +| type | string | true | Must be "trino". | +| host | string | true | Trino coordinator hostname (e.g. "trino.example.com") | +| port | string | true | Trino coordinator port (e.g. "8080", "8443") | +| user | string | false | Username for authentication (e.g. "analyst"). Optional for anonymous access. | +| password | string | false | Password for basic authentication | +| catalog | string | true | Default catalog to use for queries (e.g. "hive") | +| schema | string | true | Default schema to use for queries (e.g. "default") | +| queryTimeout | string | false | Query timeout duration (e.g. "30m", "1h") | +| accessToken | string | false | JWT access token for authentication | +| kerberosEnabled | boolean | false | Enable Kerberos authentication (default: false) | +| sslEnabled | boolean | false | Enable SSL/TLS (default: false) | +| disableSslVerification | boolean | false | Skip SSL/TLS certificate verification (default: false) | +| sslCertPath | string | false | Path to a custom SSL/TLS certificate file | +| sslCert | string | false | Custom SSL/TLS certificate content | diff --git a/docs/en/integrations/trino/tools/_index.md b/docs/en/integrations/trino/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/trino/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/trino/trino-execute-sql.md b/docs/en/integrations/trino/tools/trino-execute-sql.md similarity index 97% rename from docs/en/integrations/trino/trino-execute-sql.md rename to docs/en/integrations/trino/tools/trino-execute-sql.md index c22918a9a8cc..9d63f40347b2 100644 --- a/docs/en/integrations/trino/trino-execute-sql.md +++ b/docs/en/integrations/trino/tools/trino-execute-sql.md @@ -1,5 +1,5 @@ --- -title: "trino-execute-sql Tool" +title: "trino-execute-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/trino/trino-sql.md b/docs/en/integrations/trino/tools/trino-sql.md similarity index 99% rename from docs/en/integrations/trino/trino-sql.md rename to docs/en/integrations/trino/tools/trino-sql.md index 57fe6a5c8e54..dee4cbba5909 100644 --- a/docs/en/integrations/trino/trino-sql.md +++ b/docs/en/integrations/trino/tools/trino-sql.md @@ -1,5 +1,5 @@ --- -title: "trino-sql Tool" +title: "trino-sql" type: docs weight: 1 description: > diff --git a/docs/en/integrations/utility/_index.md b/docs/en/integrations/utility/_index.md index 544fd879e9c6..1abd9c294ad0 100644 --- a/docs/en/integrations/utility/_index.md +++ b/docs/en/integrations/utility/_index.md @@ -2,6 +2,4 @@ title: "Utility tools" type: docs weight: 1 -description: > - Tools that provide utility. --- \ No newline at end of file diff --git a/docs/en/integrations/utility/tools/_index.md b/docs/en/integrations/utility/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/utility/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/utility/wait.md b/docs/en/integrations/utility/tools/wait.md similarity index 98% rename from docs/en/integrations/utility/wait.md rename to docs/en/integrations/utility/tools/wait.md index c79e5b289e71..635fac64b4fd 100644 --- a/docs/en/integrations/utility/wait.md +++ b/docs/en/integrations/utility/tools/wait.md @@ -1,5 +1,5 @@ --- -title: "wait Tool" +title: "wait" type: docs weight: 1 description: > diff --git a/docs/en/integrations/valkey/_index.md b/docs/en/integrations/valkey/_index.md index 63ecf60ae2b8..7fe9348a0ef2 100644 --- a/docs/en/integrations/valkey/_index.md +++ b/docs/en/integrations/valkey/_index.md @@ -1,75 +1,4 @@ --- -title: "Valkey Source" -linkTitle: "Valkey" -type: docs +title: "Valkey" weight: 1 -description: > - Valkey is an open-source, in-memory data structure store, forked from Redis. -no_list: true ---- - -## About - -Valkey is an open-source, in-memory data structure store that originated as a -fork of Redis. It's designed to be used as a database, cache, and message -broker, supporting a wide range of data structures like strings, hashes, lists, -sets, sorted sets with range queries, bitmaps, hyperloglogs, and geospatial -indexes with radius queries. - -If you're new to Valkey, you can find installation and getting started guides on -the [official Valkey website](https://valkey.io/topics/quickstart/). - - - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-valkey-instance -type: valkey -address: - - 127.0.0.1:6379 -username: ${YOUR_USERNAME} -password: ${YOUR_PASSWORD} -# database: 0 -# useGCPIAM: false -# disableCache: false -``` - -{{< notice tip >}} -Use environment variable replacement with the format ${ENV_NAME} -instead of hardcoding your secrets into the configuration file. -{{< /notice >}} - -### IAM Authentication - -If you are using GCP's Memorystore for Valkey, you can connect using IAM -authentication. Grant your account the required [IAM role][iam] and set -`useGCPIAM` to `true`: - -```yaml -kind: sources -name: my-valkey-instance -type: valkey -address: - - 127.0.0.1:6379 -useGCPIAM: true -``` - -[iam]: https://cloud.google.com/memorystore/docs/valkey/about-iam-auth - -## Reference - -| **field** | **type** | **required** | **description** | -|--------------|:--------:|:------------:|----------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "valkey". | -| address | []string | true | Endpoints for the Valkey instance to connect to. | -| username | string | false | If you are using a non-default user, specify the user name here. If you are using Memorystore for Valkey, leave this field blank | -| password | string | false | Password for the Valkey instance | -| database | int | false | The Valkey database to connect to. Not applicable for cluster enabled instances. The default database is `0`. | -| useGCPIAM | bool | false | Set it to `true` if you are using GCP's IAM authentication. Defaults to `false`. | -| disableCache | bool | false | Set it to `true` if you want to enable client-side caching. Defaults to `false`. | +--- \ No newline at end of file diff --git a/docs/en/integrations/valkey/source.md b/docs/en/integrations/valkey/source.md new file mode 100644 index 000000000000..c74504870d93 --- /dev/null +++ b/docs/en/integrations/valkey/source.md @@ -0,0 +1,75 @@ +--- +title: "Valkey Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + Valkey is an open-source, in-memory data structure store, forked from Redis. +no_list: true +--- + +## About + +Valkey is an open-source, in-memory data structure store that originated as a +fork of Redis. It's designed to be used as a database, cache, and message +broker, supporting a wide range of data structures like strings, hashes, lists, +sets, sorted sets with range queries, bitmaps, hyperloglogs, and geospatial +indexes with radius queries. + +If you're new to Valkey, you can find installation and getting started guides on +the [official Valkey website](https://valkey.io/topics/quickstart/). + + + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-valkey-instance +type: valkey +address: + - 127.0.0.1:6379 +username: ${YOUR_USERNAME} +password: ${YOUR_PASSWORD} +# database: 0 +# useGCPIAM: false +# disableCache: false +``` + +{{< notice tip >}} +Use environment variable replacement with the format ${ENV_NAME} +instead of hardcoding your secrets into the configuration file. +{{< /notice >}} + +### IAM Authentication + +If you are using GCP's Memorystore for Valkey, you can connect using IAM +authentication. Grant your account the required [IAM role][iam] and set +`useGCPIAM` to `true`: + +```yaml +kind: sources +name: my-valkey-instance +type: valkey +address: + - 127.0.0.1:6379 +useGCPIAM: true +``` + +[iam]: https://cloud.google.com/memorystore/docs/valkey/about-iam-auth + +## Reference + +| **field** | **type** | **required** | **description** | +|--------------|:--------:|:------------:|----------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "valkey". | +| address | []string | true | Endpoints for the Valkey instance to connect to. | +| username | string | false | If you are using a non-default user, specify the user name here. If you are using Memorystore for Valkey, leave this field blank | +| password | string | false | Password for the Valkey instance | +| database | int | false | The Valkey database to connect to. Not applicable for cluster enabled instances. The default database is `0`. | +| useGCPIAM | bool | false | Set it to `true` if you are using GCP's IAM authentication. Defaults to `false`. | +| disableCache | bool | false | Set it to `true` if you want to enable client-side caching. Defaults to `false`. | diff --git a/docs/en/integrations/valkey/tools/_index.md b/docs/en/integrations/valkey/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/valkey/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/valkey/valkey-tool.md b/docs/en/integrations/valkey/tools/valkey-tool.md similarity index 98% rename from docs/en/integrations/valkey/valkey-tool.md rename to docs/en/integrations/valkey/tools/valkey-tool.md index 7c0049cc6e3b..770ebda0d00f 100644 --- a/docs/en/integrations/valkey/valkey-tool.md +++ b/docs/en/integrations/valkey/tools/valkey-tool.md @@ -1,5 +1,5 @@ --- -title: "valkey Tool" +title: "valkey" type: docs weight: 1 description: > diff --git a/docs/en/integrations/yuagbytedb/_index.md b/docs/en/integrations/yuagbytedb/_index.md index 986db14aa7fa..3ad3c614cf79 100644 --- a/docs/en/integrations/yuagbytedb/_index.md +++ b/docs/en/integrations/yuagbytedb/_index.md @@ -1,53 +1,4 @@ --- -title: "YugabyteDB Source" -type: docs +title: "YugabyteDB" weight: 1 -description: > - YugabyteDB is a high-performance, distributed SQL database. -no_list: true ---- - -## About - -[YugabyteDB][yugabytedb] is a high-performance, distributed SQL database -designed for global, internet-scale applications, with full PostgreSQL -compatibility. - -[yugabytedb]: https://www.yugabyte.com/ - - - -## Available Tools - -{{< list-tools >}} - -## Example - -```yaml -kind: sources -name: my-yb-source -type: yugabytedb -host: 127.0.0.1 -port: 5433 -database: yugabyte -user: ${USER_NAME} -password: ${PASSWORD} -loadBalance: true -topologyKeys: cloud.region.zone1:1,cloud.region.zone2:2 -``` - -## Reference - -| **field** | **type** | **required** | **description** | -|------------------------------|:--------:|:------------:|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| type | string | true | Must be "yugabytedb". | -| host | string | true | IP address to connect to. | -| port | integer | true | Port to connect to. The default port is 5433. | -| database | string | true | Name of the YugabyteDB database to connect to. The default database name is yugabyte. | -| user | string | true | Name of the YugabyteDB user to connect as. The default user is yugabyte. | -| password | string | true | Password of the YugabyteDB user. The default password is yugabyte. | -| loadBalance | boolean | false | If true, enable uniform load balancing. The default loadBalance value is false. | -| topologyKeys | string | false | Comma-separated geo-locations in the form cloud.region.zone:priority to enable topology-aware load balancing. Ignored if loadBalance is false. It is null by default. | -| ybServersRefreshInterval | integer | false | The interval (in seconds) to refresh the servers list; ignored if loadBalance is false. The default value of ybServersRefreshInterval is 300. | -| fallbackToTopologyKeysOnly | boolean | false | If set to true and topologyKeys are specified, only connect to nodes specified in topologyKeys. By defualt, this is set to false. | -| failedHostReconnectDelaySecs | integer | false | Time (in seconds) to wait before trying to connect to failed nodes. The default value of is 5. | +--- \ No newline at end of file diff --git a/docs/en/integrations/yuagbytedb/source.md b/docs/en/integrations/yuagbytedb/source.md new file mode 100644 index 000000000000..f095219a74e5 --- /dev/null +++ b/docs/en/integrations/yuagbytedb/source.md @@ -0,0 +1,54 @@ +--- +title: "YugabyteDB Source" +linkTitle: "Source" +type: docs +weight: 1 +description: > + YugabyteDB is a high-performance, distributed SQL database. +no_list: true +--- + +## About + +[YugabyteDB][yugabytedb] is a high-performance, distributed SQL database +designed for global, internet-scale applications, with full PostgreSQL +compatibility. + +[yugabytedb]: https://www.yugabyte.com/ + + + +## Available Tools + +{{< list-tools >}} + +## Example + +```yaml +kind: sources +name: my-yb-source +type: yugabytedb +host: 127.0.0.1 +port: 5433 +database: yugabyte +user: ${USER_NAME} +password: ${PASSWORD} +loadBalance: true +topologyKeys: cloud.region.zone1:1,cloud.region.zone2:2 +``` + +## Reference + +| **field** | **type** | **required** | **description** | +|------------------------------|:--------:|:------------:|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| type | string | true | Must be "yugabytedb". | +| host | string | true | IP address to connect to. | +| port | integer | true | Port to connect to. The default port is 5433. | +| database | string | true | Name of the YugabyteDB database to connect to. The default database name is yugabyte. | +| user | string | true | Name of the YugabyteDB user to connect as. The default user is yugabyte. | +| password | string | true | Password of the YugabyteDB user. The default password is yugabyte. | +| loadBalance | boolean | false | If true, enable uniform load balancing. The default loadBalance value is false. | +| topologyKeys | string | false | Comma-separated geo-locations in the form cloud.region.zone:priority to enable topology-aware load balancing. Ignored if loadBalance is false. It is null by default. | +| ybServersRefreshInterval | integer | false | The interval (in seconds) to refresh the servers list; ignored if loadBalance is false. The default value of ybServersRefreshInterval is 300. | +| fallbackToTopologyKeysOnly | boolean | false | If set to true and topologyKeys are specified, only connect to nodes specified in topologyKeys. By defualt, this is set to false. | +| failedHostReconnectDelaySecs | integer | false | Time (in seconds) to wait before trying to connect to failed nodes. The default value of is 5. | diff --git a/docs/en/integrations/yuagbytedb/tools/_index.md b/docs/en/integrations/yuagbytedb/tools/_index.md new file mode 100644 index 000000000000..ffecf203aa2e --- /dev/null +++ b/docs/en/integrations/yuagbytedb/tools/_index.md @@ -0,0 +1,4 @@ +--- +title: "Tools" +weight: 2 +--- \ No newline at end of file diff --git a/docs/en/integrations/yuagbytedb/yugabytedb-sql.md b/docs/en/integrations/yuagbytedb/tools/yugabytedb-sql.md similarity index 99% rename from docs/en/integrations/yuagbytedb/yugabytedb-sql.md rename to docs/en/integrations/yuagbytedb/tools/yugabytedb-sql.md index b89c5cc68f25..a5c95573c76c 100644 --- a/docs/en/integrations/yuagbytedb/yugabytedb-sql.md +++ b/docs/en/integrations/yuagbytedb/tools/yugabytedb-sql.md @@ -1,5 +1,5 @@ --- -title: "yugabytedb-sql Tool" +title: "yugabytedb-sql" type: docs weight: 1 description: > diff --git a/docs/en/reference/cli.md b/docs/en/reference/cli.md index 07ca6acb5568..d0c4db6bd895 100644 --- a/docs/en/reference/cli.md +++ b/docs/en/reference/cli.md @@ -16,7 +16,7 @@ description: > | | `--log-level` | Specify the minimum level logged. Allowed: 'DEBUG', 'INFO', 'WARN', 'ERROR'. | `info` | | | `--logging-format` | Specify logging format to use. Allowed: 'standard' or 'JSON'. | `standard` | | `-p` | `--port` | Port the server will listen on. | `5000` | -| | `--prebuilt` | Use one or more prebuilt tool configuration by source type. See [Prebuilt Tools Reference](../user-guide/configuration/prebuilt-configs/_index.md) for allowed values. | | +| | `--prebuilt` | Use one or more prebuilt tool configuration by source type. See [Prebuilt Tools Reference](../documentation/configuration/prebuilt-configs/_index.md) for allowed values. | | | | `--stdio` | Listens via MCP STDIO instead of acting as a remote HTTP server. | | | | `--telemetry-gcp` | Enable exporting directly to Google Cloud Monitoring. | | | | `--telemetry-otlp` | Enable exporting using OpenTelemetry Protocol (OTLP) to the specified endpoint (e.g. 'http://127.0.0.1:4318') | | @@ -49,7 +49,7 @@ toolbox invoke [params] - `tool-name`: The name of the tool to execute (as defined in your configuration). - `params`: (Optional) A JSON string containing the parameters for the tool. -For more detailed instructions, see [Invoke Tools via CLI](../user-guide/configuration/tools/invoke_tool.md). +For more detailed instructions, see [Invoke Tools via CLI](../documentation/configuration/tools/invoke_tool.md). @@ -71,7 +71,7 @@ toolbox skills-generate --name --description --toolset @@ -122,7 +122,7 @@ The CLI supports multiple mutually exclusive ways to specify tool configurations **Prebuilt Configurations:** - `--prebuilt`: Use one or more predefined configurations for specific database types (e.g., - 'bigquery', 'postgres', 'spanner'). See [Prebuilt Tools](../user-guide/configuration/prebuilt-configs/_index.md) for allowed values. + 'bigquery', 'postgres', 'spanner'). See [Prebuilt Tools](../documentation/configuration/prebuilt-configs/_index.md) for allowed values. {{< notice tip >}} The CLI enforces mutual exclusivity between configuration source flags, @@ -150,4 +150,4 @@ reloading, use the `--disable-reload` flag. To launch Toolbox's interactive UI, use the `--ui` flag. This allows you to test tools and toolsets with features such as authorized parameters. To learn more, -visit [Toolbox UI](../user-guide/configuration/toolbox-ui/index.md). +visit [Toolbox UI](../documentation/configuration/toolbox-ui/index.md). diff --git a/docs/en/reference/faq.md b/docs/en/reference/faq.md index 2463d0018ee4..6296b5647c60 100644 --- a/docs/en/reference/faq.md +++ b/docs/en/reference/faq.md @@ -13,8 +13,8 @@ docker images][release-notes] (but you can always compile yourself as well!). For detailed instructions, check out these resources: -- [Quickstart: How to Run Locally](../build-with-mcp-toolbox/local_quickstart.md) -- [Deploy to Cloud Run](../user-guide/deploy-to/cloud-run/_index.md) +- [Quickstart: How to Run Locally](../documentation/getting-started/local_quickstart.md) +- [Deploy to Cloud Run](../documentation/deploy-to/cloud-run/_index.md) [release-notes]: https://github.com/googleapis/genai-toolbox/releases/ @@ -79,5 +79,5 @@ than in Python. Yes! Toolbox is compatible with [Anthropic's Model Context Protocol (MCP)](https://modelcontextprotocol.io/). Please checkout [Connect via -MCP](../user-guide/connect-to/mcp-client/_index.md) on how to connect to Toolbox with an MCP +MCP](../documentation/connect-to/mcp-client/_index.md) on how to connect to Toolbox with an MCP client. diff --git a/docs/en/build-with-mcp-toolbox/_index.md b/docs/en/samples-hub/_index.md similarity index 85% rename from docs/en/build-with-mcp-toolbox/_index.md rename to docs/en/samples-hub/_index.md index c73398422fe4..8a3eeb7932bf 100644 --- a/docs/en/build-with-mcp-toolbox/_index.md +++ b/docs/en/samples-hub/_index.md @@ -1,11 +1,15 @@ --- -title: "Build with MCP Toolbox" -type: docs +title: "Samples Hub" weight: 5 description: > Step-by-step tutorials and project guides for building AI agents and workflows with the MCP Toolbox. +no_list: true --- +# Samples Hub + Now that you understand the core concepts and have your server configured, it is time to put those tools to work in real-world scenarios. Explore the step-by-step guides below to learn how to integrate your databases with different orchestration frameworks and build capable AI agents: + +{{< samples-gallery >}} \ No newline at end of file diff --git a/docs/en/build-with-mcp-toolbox/deploy_adk_agent.md b/docs/en/samples-hub/deploy_adk_agent.md similarity index 91% rename from docs/en/build-with-mcp-toolbox/deploy_adk_agent.md rename to docs/en/samples-hub/deploy_adk_agent.md index 7bb6be181163..e98f5f28f280 100644 --- a/docs/en/build-with-mcp-toolbox/deploy_adk_agent.md +++ b/docs/en/samples-hub/deploy_adk_agent.md @@ -4,24 +4,26 @@ type: docs weight: 4 description: > How to deploy your ADK Agent to Vertex AI Agent Engine and connect it to an MCP Toolbox deployed on Cloud Run. +sample_filters: ["Python", "ADK", "Agent"] +is_sample: true --- ## Before you begin This guide assumes you have already done the following: -1. Completed the [Python Quickstart - (Local)](../build-with-mcp-toolbox/local_quickstart.md) and have a working ADK +1. Completed the [Python Quickstart + (Local)](../documentation/getting-started/local_quickstart.md) and have a working ADK agent running locally. -2. Installed the [Google Cloud CLI](https://cloud.google.com/sdk/docs/install). -3. A Google Cloud project with billing enabled. +3. Installed the [Google Cloud CLI](https://cloud.google.com/sdk/docs/install). +4. A Google Cloud project with billing enabled. ## Step 1: Deploy MCP Toolbox to Cloud Run Before deploying your agent, your MCP Toolbox server needs to be accessible from the cloud. We will deploy MCP Toolbox to Cloud Run. -Follow the [Deploy to Cloud Run](../user-guide/deploy-to/cloud-run/_index.md) guide to deploy your MCP +Follow the [Deploy to Cloud Run](../documentation/deploy-to/cloud-run/_index.md) guide to deploy your MCP Toolbox instance. {{% alert title="Important" %}} diff --git a/docs/en/build-with-mcp-toolbox/prompts_quickstart_gemini_cli.md b/docs/en/samples-hub/prompts_quickstart_gemini_cli.md similarity index 99% rename from docs/en/build-with-mcp-toolbox/prompts_quickstart_gemini_cli.md rename to docs/en/samples-hub/prompts_quickstart_gemini_cli.md index f828f5d6b7a5..08b59f22f587 100644 --- a/docs/en/build-with-mcp-toolbox/prompts_quickstart_gemini_cli.md +++ b/docs/en/samples-hub/prompts_quickstart_gemini_cli.md @@ -4,6 +4,8 @@ type: docs weight: 6 description: > How to get started using Toolbox prompts locally with PostgreSQL and [Gemini CLI](https://pypi.org/project/gemini-cli/). +sample_filters: ["Prompts", "Gemini CLI"] +is_sample: true --- ## Before you begin diff --git a/docs/en/user-guide/_index.md b/docs/en/user-guide/_index.md deleted file mode 100644 index 68b518b86077..000000000000 --- a/docs/en/user-guide/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "User Guide" -type: docs -notoc: false -weight: 3 -description: > - A complete user guide for MCP Toolbox ---- \ No newline at end of file diff --git a/docs/en/user-guide/connect-to/ides/alloydb_pg_admin_mcp.md b/docs/en/user-guide/connect-to/ides/alloydb_pg_admin_mcp.md deleted file mode 100644 index d27151d5eacb..000000000000 --- a/docs/en/user-guide/connect-to/ides/alloydb_pg_admin_mcp.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "AlloyDB Admin API using MCP" -type: docs -weight: 2 -description: > - Create your AlloyDB database with MCP Toolbox. ---- - - - - - - - diff --git a/docs/en/user-guide/connect-to/ides/alloydb_pg_mcp.md b/docs/en/user-guide/connect-to/ides/alloydb_pg_mcp.md deleted file mode 100644 index 5101f0fe724c..000000000000 --- a/docs/en/user-guide/connect-to/ides/alloydb_pg_mcp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "AlloyDB using MCP" -type: docs -weight: 2 -description: > - Connect your IDE to AlloyDB using Toolbox. ---- - - - - - - diff --git a/docs/en/user-guide/connect-to/ides/bigquery_mcp.md b/docs/en/user-guide/connect-to/ides/bigquery_mcp.md deleted file mode 100644 index bb7c4dd3ea37..000000000000 --- a/docs/en/user-guide/connect-to/ides/bigquery_mcp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "BigQuery using MCP" -type: docs -weight: 2 -description: > - Connect your IDE to BigQuery using Toolbox. ---- - - - - - - diff --git a/docs/en/user-guide/connect-to/ides/cloud_sql_mssql_mcp.md b/docs/en/user-guide/connect-to/ides/cloud_sql_mssql_mcp.md deleted file mode 100644 index 791e9870b63a..000000000000 --- a/docs/en/user-guide/connect-to/ides/cloud_sql_mssql_mcp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Cloud SQL for SQL Server using MCP" -type: docs -weight: 2 -description: > - Connect your IDE to Cloud SQL for SQL Server using Toolbox. ---- - - - - - - diff --git a/docs/en/user-guide/connect-to/ides/cloud_sql_mysql_mcp.md b/docs/en/user-guide/connect-to/ides/cloud_sql_mysql_mcp.md deleted file mode 100644 index 94995e536a71..000000000000 --- a/docs/en/user-guide/connect-to/ides/cloud_sql_mysql_mcp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Cloud SQL for MySQL using MCP" -type: docs -weight: 2 -description: > - Connect your IDE to Cloud SQL for MySQL using Toolbox. ---- - - - - - - diff --git a/docs/en/user-guide/connect-to/ides/cloud_sql_pg_mcp.md b/docs/en/user-guide/connect-to/ides/cloud_sql_pg_mcp.md deleted file mode 100644 index 217d17056995..000000000000 --- a/docs/en/user-guide/connect-to/ides/cloud_sql_pg_mcp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Cloud SQL for Postgres using MCP" -type: docs -weight: 2 -description: > - Connect your IDE to Cloud SQL for Postgres using Toolbox. ---- - - - - - - diff --git a/docs/en/user-guide/connect-to/ides/firestore_mcp.md b/docs/en/user-guide/connect-to/ides/firestore_mcp.md deleted file mode 100644 index dc857e503f6c..000000000000 --- a/docs/en/user-guide/connect-to/ides/firestore_mcp.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "Firestore using MCP" -type: docs -weight: 2 -description: > - Connect your IDE to Firestore using Toolbox. ---- - - - - - - - diff --git a/docs/en/user-guide/connect-to/ides/spanner_mcp.md b/docs/en/user-guide/connect-to/ides/spanner_mcp.md deleted file mode 100644 index 9e38b28c6c7c..000000000000 --- a/docs/en/user-guide/connect-to/ides/spanner_mcp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Spanner using MCP" -type: docs -weight: 2 -description: > - Connect your IDE to Spanner using Toolbox. ---- - - - - - -