This is page 1 of 33. Use http://codebase.md/googleapis/genai-toolbox?page={x} to view the full context. # Directory Structure ``` ├── .ci │ ├── continuous.release.cloudbuild.yaml │ ├── generate_release_table.sh │ ├── integration.cloudbuild.yaml │ ├── quickstart_test │ │ ├── go.integration.cloudbuild.yaml │ │ ├── js.integration.cloudbuild.yaml │ │ ├── py.integration.cloudbuild.yaml │ │ ├── run_go_tests.sh │ │ ├── run_js_tests.sh │ │ ├── run_py_tests.sh │ │ └── setup_hotels_sample.sql │ ├── test_with_coverage.sh │ └── versioned.release.cloudbuild.yaml ├── .github │ ├── auto-label.yaml │ ├── blunderbuss.yml │ ├── CODEOWNERS │ ├── header-checker-lint.yml │ ├── ISSUE_TEMPLATE │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── feature_request.yml │ │ └── question.yml │ ├── label-sync.yml │ ├── labels.yaml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── release-please.yml │ ├── renovate.json5 │ ├── sync-repo-settings.yaml │ └── workflows │ ├── cloud_build_failure_reporter.yml │ ├── deploy_dev_docs.yaml │ ├── deploy_previous_version_docs.yaml │ ├── deploy_versioned_docs.yaml │ ├── docs_deploy.yaml │ ├── docs_preview_clean.yaml │ ├── docs_preview_deploy.yaml │ ├── lint.yaml │ ├── schedule_reporter.yml │ ├── sync-labels.yaml │ └── tests.yaml ├── .gitignore ├── .gitmodules ├── .golangci.yaml ├── .hugo │ ├── archetypes │ │ └── default.md │ ├── assets │ │ ├── icons │ │ │ └── logo.svg │ │ └── scss │ │ ├── _styles_project.scss │ │ └── _variables_project.scss │ ├── go.mod │ ├── go.sum │ ├── hugo.toml │ ├── layouts │ │ ├── _default │ │ │ └── home.releases.releases │ │ ├── index.llms-full.txt │ │ ├── index.llms.txt │ │ ├── partials │ │ │ ├── hooks │ │ │ │ └── head-end.html │ │ │ ├── navbar-version-selector.html │ │ │ ├── page-meta-links.html │ │ │ └── td │ │ │ └── render-heading.html │ │ ├── robot.txt │ │ └── shortcodes │ │ ├── include.html │ │ ├── ipynb.html │ │ └── regionInclude.html │ ├── package-lock.json │ ├── package.json │ └── static │ ├── favicons │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── apple-touch-icon.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ └── favicon.ico │ └── js │ └── w3.js ├── CHANGELOG.md ├── cmd │ ├── options_test.go │ ├── options.go │ ├── root_test.go │ ├── root.go │ └── version.txt ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── DEVELOPER.md ├── Dockerfile ├── docs │ └── en │ ├── _index.md │ ├── about │ │ ├── _index.md │ │ └── faq.md │ ├── concepts │ │ ├── _index.md │ │ └── telemetry │ │ ├── index.md │ │ ├── telemetry_flow.png │ │ └── telemetry_traces.png │ ├── getting-started │ │ ├── _index.md │ │ ├── colab_quickstart.ipynb │ │ ├── configure.md │ │ ├── introduction │ │ │ ├── _index.md │ │ │ └── architecture.png │ │ ├── local_quickstart_go.md │ │ ├── local_quickstart_js.md │ │ ├── local_quickstart.md │ │ ├── mcp_quickstart │ │ │ ├── _index.md │ │ │ ├── inspector_tools.png │ │ │ └── inspector.png │ │ └── quickstart │ │ ├── go │ │ │ ├── genAI │ │ │ │ ├── go.mod │ │ │ │ ├── go.sum │ │ │ │ └── quickstart.go │ │ │ ├── genkit │ │ │ │ ├── go.mod │ │ │ │ ├── go.sum │ │ │ │ └── quickstart.go │ │ │ ├── langchain │ │ │ │ ├── go.mod │ │ │ │ ├── go.sum │ │ │ │ └── quickstart.go │ │ │ ├── openAI │ │ │ │ ├── go.mod │ │ │ │ ├── go.sum │ │ │ │ └── quickstart.go │ │ │ └── quickstart_test.go │ │ ├── golden.txt │ │ ├── js │ │ │ ├── genAI │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ └── quickstart.js │ │ │ ├── genkit │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ └── quickstart.js │ │ │ ├── langchain │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ └── quickstart.js │ │ │ ├── llamaindex │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ └── quickstart.js │ │ │ └── quickstart.test.js │ │ ├── python │ │ │ ├── __init__.py │ │ │ ├── adk │ │ │ │ ├── quickstart.py │ │ │ │ └── requirements.txt │ │ │ ├── core │ │ │ │ ├── quickstart.py │ │ │ │ └── requirements.txt │ │ │ ├── langchain │ │ │ │ ├── quickstart.py │ │ │ │ └── requirements.txt │ │ │ ├── llamaindex │ │ │ │ ├── quickstart.py │ │ │ │ └── requirements.txt │ │ │ └── quickstart_test.py │ │ └── shared │ │ ├── cloud_setup.md │ │ ├── configure_toolbox.md │ │ └── database_setup.md │ ├── how-to │ │ ├── _index.md │ │ ├── connect_via_geminicli.md │ │ ├── connect_via_mcp.md │ │ ├── connect-ide │ │ │ ├── _index.md │ │ │ ├── alloydb_pg_admin_mcp.md │ │ │ ├── alloydb_pg_mcp.md │ │ │ ├── bigquery_mcp.md │ │ │ ├── cloud_sql_mssql_admin_mcp.md │ │ │ ├── cloud_sql_mssql_mcp.md │ │ │ ├── cloud_sql_mysql_admin_mcp.md │ │ │ ├── cloud_sql_mysql_mcp.md │ │ │ ├── cloud_sql_pg_admin_mcp.md │ │ │ ├── cloud_sql_pg_mcp.md │ │ │ ├── firestore_mcp.md │ │ │ ├── looker_mcp.md │ │ │ ├── mssql_mcp.md │ │ │ ├── mysql_mcp.md │ │ │ ├── neo4j_mcp.md │ │ │ ├── postgres_mcp.md │ │ │ ├── spanner_mcp.md │ │ │ └── sqlite_mcp.md │ │ ├── deploy_docker.md │ │ ├── deploy_gke.md │ │ ├── deploy_toolbox.md │ │ ├── export_telemetry.md │ │ └── toolbox-ui │ │ ├── edit-headers.gif │ │ ├── edit-headers.png │ │ ├── index.md │ │ ├── optional-param-checked.png │ │ ├── optional-param-unchecked.png │ │ ├── run-tool.gif │ │ ├── tools.png │ │ └── toolsets.png │ ├── reference │ │ ├── _index.md │ │ ├── cli.md │ │ └── prebuilt-tools.md │ ├── resources │ │ ├── _index.md │ │ ├── authServices │ │ │ ├── _index.md │ │ │ └── google.md │ │ ├── sources │ │ │ ├── _index.md │ │ │ ├── alloydb-admin.md │ │ │ ├── alloydb-pg.md │ │ │ ├── bigquery.md │ │ │ ├── bigtable.md │ │ │ ├── cassandra.md │ │ │ ├── clickhouse.md │ │ │ ├── cloud-monitoring.md │ │ │ ├── cloud-sql-admin.md │ │ │ ├── cloud-sql-mssql.md │ │ │ ├── cloud-sql-mysql.md │ │ │ ├── cloud-sql-pg.md │ │ │ ├── couchbase.md │ │ │ ├── dataplex.md │ │ │ ├── dgraph.md │ │ │ ├── firebird.md │ │ │ ├── firestore.md │ │ │ ├── http.md │ │ │ ├── looker.md │ │ │ ├── mongodb.md │ │ │ ├── mssql.md │ │ │ ├── mysql.md │ │ │ ├── neo4j.md │ │ │ ├── oceanbase.md │ │ │ ├── oracle.md │ │ │ ├── postgres.md │ │ │ ├── redis.md │ │ │ ├── spanner.md │ │ │ ├── sqlite.md │ │ │ ├── tidb.md │ │ │ ├── trino.md │ │ │ ├── valkey.md │ │ │ └── yugabytedb.md │ │ └── tools │ │ ├── _index.md │ │ ├── alloydb │ │ │ ├── _index.md │ │ │ ├── alloydb-create-cluster.md │ │ │ ├── alloydb-create-instance.md │ │ │ ├── alloydb-create-user.md │ │ │ ├── alloydb-get-cluster.md │ │ │ ├── alloydb-get-instance.md │ │ │ ├── alloydb-get-user.md │ │ │ ├── alloydb-list-clusters.md │ │ │ ├── alloydb-list-instances.md │ │ │ ├── alloydb-list-users.md │ │ │ └── alloydb-wait-for-operation.md │ │ ├── alloydbainl │ │ │ ├── _index.md │ │ │ └── alloydb-ai-nl.md │ │ ├── bigquery │ │ │ ├── _index.md │ │ │ ├── bigquery-analyze-contribution.md │ │ │ ├── bigquery-conversational-analytics.md │ │ │ ├── bigquery-execute-sql.md │ │ │ ├── bigquery-forecast.md │ │ │ ├── bigquery-get-dataset-info.md │ │ │ ├── bigquery-get-table-info.md │ │ │ ├── bigquery-list-dataset-ids.md │ │ │ ├── bigquery-list-table-ids.md │ │ │ ├── bigquery-search-catalog.md │ │ │ └── bigquery-sql.md │ │ ├── bigtable │ │ │ ├── _index.md │ │ │ └── bigtable-sql.md │ │ ├── cassandra │ │ │ ├── _index.md │ │ │ └── cassandra-cql.md │ │ ├── clickhouse │ │ │ ├── _index.md │ │ │ ├── clickhouse-execute-sql.md │ │ │ ├── clickhouse-list-databases.md │ │ │ ├── clickhouse-list-tables.md │ │ │ └── clickhouse-sql.md │ │ ├── cloudmonitoring │ │ │ ├── _index.md │ │ │ └── cloud-monitoring-query-prometheus.md │ │ ├── cloudsql │ │ │ ├── _index.md │ │ │ ├── cloudsqlcreatedatabase.md │ │ │ ├── cloudsqlcreateusers.md │ │ │ ├── cloudsqlgetinstances.md │ │ │ ├── cloudsqllistdatabases.md │ │ │ ├── cloudsqllistinstances.md │ │ │ ├── cloudsqlmssqlcreateinstance.md │ │ │ ├── cloudsqlmysqlcreateinstance.md │ │ │ ├── cloudsqlpgcreateinstances.md │ │ │ └── cloudsqlwaitforoperation.md │ │ ├── couchbase │ │ │ ├── _index.md │ │ │ └── couchbase-sql.md │ │ ├── dataform │ │ │ ├── _index.md │ │ │ └── dataform-compile-local.md │ │ ├── dataplex │ │ │ ├── _index.md │ │ │ ├── dataplex-lookup-entry.md │ │ │ ├── dataplex-search-aspect-types.md │ │ │ └── dataplex-search-entries.md │ │ ├── dgraph │ │ │ ├── _index.md │ │ │ └── dgraph-dql.md │ │ ├── firebird │ │ │ ├── _index.md │ │ │ ├── firebird-execute-sql.md │ │ │ └── firebird-sql.md │ │ ├── firestore │ │ │ ├── _index.md │ │ │ ├── firestore-add-documents.md │ │ │ ├── firestore-delete-documents.md │ │ │ ├── firestore-get-documents.md │ │ │ ├── firestore-get-rules.md │ │ │ ├── firestore-list-collections.md │ │ │ ├── firestore-query-collection.md │ │ │ ├── firestore-query.md │ │ │ ├── firestore-update-document.md │ │ │ └── firestore-validate-rules.md │ │ ├── http │ │ │ ├── _index.md │ │ │ └── http.md │ │ ├── looker │ │ │ ├── _index.md │ │ │ ├── looker-add-dashboard-element.md │ │ │ ├── looker-conversational-analytics.md │ │ │ ├── looker-get-dashboards.md │ │ │ ├── looker-get-dimensions.md │ │ │ ├── looker-get-explores.md │ │ │ ├── looker-get-filters.md │ │ │ ├── looker-get-looks.md │ │ │ ├── looker-get-measures.md │ │ │ ├── looker-get-models.md │ │ │ ├── looker-get-parameters.md │ │ │ ├── looker-health-analyze.md │ │ │ ├── looker-health-pulse.md │ │ │ ├── looker-health-vacuum.md │ │ │ ├── looker-make-dashboard.md │ │ │ ├── looker-make-look.md │ │ │ ├── looker-query-sql.md │ │ │ ├── looker-query-url.md │ │ │ ├── looker-query.md │ │ │ └── looker-run-look.md │ │ ├── mongodb │ │ │ ├── _index.md │ │ │ ├── mongodb-aggregate.md │ │ │ ├── mongodb-delete-many.md │ │ │ ├── mongodb-delete-one.md │ │ │ ├── mongodb-find-one.md │ │ │ ├── mongodb-find.md │ │ │ ├── mongodb-insert-many.md │ │ │ ├── mongodb-insert-one.md │ │ │ ├── mongodb-update-many.md │ │ │ └── mongodb-update-one.md │ │ ├── mssql │ │ │ ├── _index.md │ │ │ ├── mssql-execute-sql.md │ │ │ ├── mssql-list-tables.md │ │ │ └── mssql-sql.md │ │ ├── mysql │ │ │ ├── _index.md │ │ │ ├── mysql-execute-sql.md │ │ │ ├── mysql-list-active-queries.md │ │ │ ├── mysql-list-table-fragmentation.md │ │ │ ├── mysql-list-tables-missing-unique-indexes.md │ │ │ ├── mysql-list-tables.md │ │ │ └── mysql-sql.md │ │ ├── neo4j │ │ │ ├── _index.md │ │ │ ├── neo4j-cypher.md │ │ │ ├── neo4j-execute-cypher.md │ │ │ └── neo4j-schema.md │ │ ├── oceanbase │ │ │ ├── _index.md │ │ │ ├── oceanbase-execute-sql.md │ │ │ └── oceanbase-sql.md │ │ ├── oracle │ │ │ ├── _index.md │ │ │ ├── oracle-execute-sql.md │ │ │ └── oracle-sql.md │ │ ├── postgres │ │ │ ├── _index.md │ │ │ ├── postgres-execute-sql.md │ │ │ ├── postgres-list-active-queries.md │ │ │ ├── postgres-list-available-extensions.md │ │ │ ├── postgres-list-installed-extensions.md │ │ │ ├── postgres-list-tables.md │ │ │ └── postgres-sql.md │ │ ├── redis │ │ │ ├── _index.md │ │ │ └── redis.md │ │ ├── spanner │ │ │ ├── _index.md │ │ │ ├── spanner-execute-sql.md │ │ │ ├── spanner-list-tables.md │ │ │ └── spanner-sql.md │ │ ├── sqlite │ │ │ ├── _index.md │ │ │ ├── sqlite-execute-sql.md │ │ │ └── sqlite-sql.md │ │ ├── tidb │ │ │ ├── _index.md │ │ │ ├── tidb-execute-sql.md │ │ │ └── tidb-sql.md │ │ ├── trino │ │ │ ├── _index.md │ │ │ ├── trino-execute-sql.md │ │ │ └── trino-sql.md │ │ ├── utility │ │ │ ├── _index.md │ │ │ └── wait.md │ │ ├── valkey │ │ │ ├── _index.md │ │ │ └── valkey.md │ │ └── yuagbytedb │ │ ├── _index.md │ │ └── yugabytedb-sql.md │ ├── samples │ │ ├── _index.md │ │ ├── alloydb │ │ │ ├── _index.md │ │ │ ├── ai-nl │ │ │ │ ├── alloydb_ai_nl.ipynb │ │ │ │ └── index.md │ │ │ └── mcp_quickstart.md │ │ ├── bigquery │ │ │ ├── _index.md │ │ │ ├── colab_quickstart_bigquery.ipynb │ │ │ ├── local_quickstart.md │ │ │ └── mcp_quickstart │ │ │ ├── _index.md │ │ │ ├── inspector_tools.png │ │ │ └── inspector.png │ │ └── looker │ │ ├── _index.md │ │ ├── looker_gemini_oauth │ │ │ ├── _index.md │ │ │ ├── authenticated.png │ │ │ ├── authorize.png │ │ │ └── registration.png │ │ ├── looker_gemini.md │ │ └── looker_mcp_inspector │ │ ├── _index.md │ │ ├── inspector_tools.png │ │ └── inspector.png │ └── sdks │ ├── _index.md │ ├── go-sdk.md │ ├── js-sdk.md │ └── python-sdk.md ├── go.mod ├── go.sum ├── internal │ ├── auth │ │ ├── auth.go │ │ └── google │ │ └── google.go │ ├── log │ │ ├── handler.go │ │ ├── log_test.go │ │ ├── log.go │ │ └── logger.go │ ├── prebuiltconfigs │ │ ├── prebuiltconfigs_test.go │ │ ├── prebuiltconfigs.go │ │ └── tools │ │ ├── alloydb-postgres-admin.yaml │ │ ├── alloydb-postgres-observability.yaml │ │ ├── alloydb-postgres.yaml │ │ ├── bigquery.yaml │ │ ├── clickhouse.yaml │ │ ├── cloud-sql-mssql-admin.yaml │ │ ├── cloud-sql-mssql-observability.yaml │ │ ├── cloud-sql-mssql.yaml │ │ ├── cloud-sql-mysql-admin.yaml │ │ ├── cloud-sql-mysql-observability.yaml │ │ ├── cloud-sql-mysql.yaml │ │ ├── cloud-sql-postgres-admin.yaml │ │ ├── cloud-sql-postgres-observability.yaml │ │ ├── cloud-sql-postgres.yaml │ │ ├── dataplex.yaml │ │ ├── firestore.yaml │ │ ├── looker-conversational-analytics.yaml │ │ ├── looker.yaml │ │ ├── mssql.yaml │ │ ├── mysql.yaml │ │ ├── neo4j.yaml │ │ ├── oceanbase.yaml │ │ ├── postgres.yaml │ │ ├── spanner-postgres.yaml │ │ ├── spanner.yaml │ │ └── sqlite.yaml │ ├── server │ │ ├── api_test.go │ │ ├── api.go │ │ ├── common_test.go │ │ ├── config.go │ │ ├── mcp │ │ │ ├── jsonrpc │ │ │ │ ├── jsonrpc_test.go │ │ │ │ └── jsonrpc.go │ │ │ ├── mcp.go │ │ │ ├── util │ │ │ │ └── lifecycle.go │ │ │ ├── v20241105 │ │ │ │ ├── method.go │ │ │ │ └── types.go │ │ │ ├── v20250326 │ │ │ │ ├── method.go │ │ │ │ └── types.go │ │ │ └── v20250618 │ │ │ ├── method.go │ │ │ └── types.go │ │ ├── mcp_test.go │ │ ├── mcp.go │ │ ├── server_test.go │ │ ├── server.go │ │ ├── static │ │ │ ├── assets │ │ │ │ └── mcptoolboxlogo.png │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── index.html │ │ │ ├── js │ │ │ │ ├── auth.js │ │ │ │ ├── loadTools.js │ │ │ │ ├── mainContent.js │ │ │ │ ├── navbar.js │ │ │ │ ├── runTool.js │ │ │ │ ├── toolDisplay.js │ │ │ │ ├── tools.js │ │ │ │ └── toolsets.js │ │ │ ├── tools.html │ │ │ └── toolsets.html │ │ ├── web_test.go │ │ └── web.go │ ├── sources │ │ ├── alloydbadmin │ │ │ ├── alloydbadmin_test.go │ │ │ └── alloydbadmin.go │ │ ├── alloydbpg │ │ │ ├── alloydb_pg_test.go │ │ │ └── alloydb_pg.go │ │ ├── bigquery │ │ │ ├── bigquery_test.go │ │ │ └── bigquery.go │ │ ├── bigtable │ │ │ ├── bigtable_test.go │ │ │ └── bigtable.go │ │ ├── cassandra │ │ │ ├── cassandra_test.go │ │ │ └── cassandra.go │ │ ├── clickhouse │ │ │ ├── clickhouse_test.go │ │ │ └── clickhouse.go │ │ ├── cloudmonitoring │ │ │ ├── cloud_monitoring_test.go │ │ │ └── cloud_monitoring.go │ │ ├── cloudsqladmin │ │ │ ├── cloud_sql_admin_test.go │ │ │ └── cloud_sql_admin.go │ │ ├── cloudsqlmssql │ │ │ ├── cloud_sql_mssql_test.go │ │ │ └── cloud_sql_mssql.go │ │ ├── cloudsqlmysql │ │ │ ├── cloud_sql_mysql_test.go │ │ │ └── cloud_sql_mysql.go │ │ ├── cloudsqlpg │ │ │ ├── cloud_sql_pg_test.go │ │ │ └── cloud_sql_pg.go │ │ ├── couchbase │ │ │ ├── couchbase_test.go │ │ │ └── couchbase.go │ │ ├── dataplex │ │ │ ├── dataplex_test.go │ │ │ └── dataplex.go │ │ ├── dgraph │ │ │ ├── dgraph_test.go │ │ │ └── dgraph.go │ │ ├── dialect.go │ │ ├── firebird │ │ │ ├── firebird_test.go │ │ │ └── firebird.go │ │ ├── firestore │ │ │ ├── firestore_test.go │ │ │ └── firestore.go │ │ ├── http │ │ │ ├── http_test.go │ │ │ └── http.go │ │ ├── ip_type.go │ │ ├── looker │ │ │ ├── looker_test.go │ │ │ └── looker.go │ │ ├── mongodb │ │ │ ├── mongodb_test.go │ │ │ └── mongodb.go │ │ ├── mssql │ │ │ ├── mssql_test.go │ │ │ └── mssql.go │ │ ├── mysql │ │ │ ├── mysql_test.go │ │ │ └── mysql.go │ │ ├── neo4j │ │ │ ├── neo4j_test.go │ │ │ └── neo4j.go │ │ ├── oceanbase │ │ │ ├── oceanbase_test.go │ │ │ └── oceanbase.go │ │ ├── oracle │ │ │ └── oracle.go │ │ ├── postgres │ │ │ ├── postgres_test.go │ │ │ └── postgres.go │ │ ├── redis │ │ │ ├── redis_test.go │ │ │ └── redis.go │ │ ├── sources.go │ │ ├── spanner │ │ │ ├── spanner_test.go │ │ │ └── spanner.go │ │ ├── sqlite │ │ │ ├── sqlite_test.go │ │ │ └── sqlite.go │ │ ├── tidb │ │ │ ├── tidb_test.go │ │ │ └── tidb.go │ │ ├── trino │ │ │ ├── trino_test.go │ │ │ └── trino.go │ │ ├── util.go │ │ ├── valkey │ │ │ ├── valkey_test.go │ │ │ └── valkey.go │ │ └── yugabytedb │ │ ├── yugabytedb_test.go │ │ └── yugabytedb.go │ ├── telemetry │ │ ├── instrumentation.go │ │ └── telemetry.go │ ├── testutils │ │ └── testutils.go │ ├── tools │ │ ├── alloydb │ │ │ ├── alloydbcreatecluster │ │ │ │ ├── alloydbcreatecluster_test.go │ │ │ │ └── alloydbcreatecluster.go │ │ │ ├── alloydbcreateinstance │ │ │ │ ├── alloydbcreateinstance_test.go │ │ │ │ └── alloydbcreateinstance.go │ │ │ ├── alloydbcreateuser │ │ │ │ ├── alloydbcreateuser_test.go │ │ │ │ └── alloydbcreateuser.go │ │ │ ├── alloydbgetcluster │ │ │ │ ├── alloydbgetcluster_test.go │ │ │ │ └── alloydbgetcluster.go │ │ │ ├── alloydbgetinstance │ │ │ │ ├── alloydbgetinstance_test.go │ │ │ │ └── alloydbgetinstance.go │ │ │ ├── alloydbgetuser │ │ │ │ ├── alloydbgetuser_test.go │ │ │ │ └── alloydbgetuser.go │ │ │ ├── alloydblistclusters │ │ │ │ ├── alloydblistclusters_test.go │ │ │ │ └── alloydblistclusters.go │ │ │ ├── alloydblistinstances │ │ │ │ ├── alloydblistinstances_test.go │ │ │ │ └── alloydblistinstances.go │ │ │ ├── alloydblistusers │ │ │ │ ├── alloydblistusers_test.go │ │ │ │ └── alloydblistusers.go │ │ │ └── alloydbwaitforoperation │ │ │ ├── alloydbwaitforoperation_test.go │ │ │ └── alloydbwaitforoperation.go │ │ ├── alloydbainl │ │ │ ├── alloydbainl_test.go │ │ │ └── alloydbainl.go │ │ ├── bigquery │ │ │ ├── bigqueryanalyzecontribution │ │ │ │ ├── bigqueryanalyzecontribution_test.go │ │ │ │ └── bigqueryanalyzecontribution.go │ │ │ ├── bigquerycommon │ │ │ │ ├── table_name_parser_test.go │ │ │ │ ├── table_name_parser.go │ │ │ │ └── util.go │ │ │ ├── bigqueryconversationalanalytics │ │ │ │ ├── bigqueryconversationalanalytics_test.go │ │ │ │ └── bigqueryconversationalanalytics.go │ │ │ ├── bigqueryexecutesql │ │ │ │ ├── bigqueryexecutesql_test.go │ │ │ │ └── bigqueryexecutesql.go │ │ │ ├── bigqueryforecast │ │ │ │ ├── bigqueryforecast_test.go │ │ │ │ └── bigqueryforecast.go │ │ │ ├── bigquerygetdatasetinfo │ │ │ │ ├── bigquerygetdatasetinfo_test.go │ │ │ │ └── bigquerygetdatasetinfo.go │ │ │ ├── bigquerygettableinfo │ │ │ │ ├── bigquerygettableinfo_test.go │ │ │ │ └── bigquerygettableinfo.go │ │ │ ├── bigquerylistdatasetids │ │ │ │ ├── bigquerylistdatasetids_test.go │ │ │ │ └── bigquerylistdatasetids.go │ │ │ ├── bigquerylisttableids │ │ │ │ ├── bigquerylisttableids_test.go │ │ │ │ └── bigquerylisttableids.go │ │ │ ├── bigquerysearchcatalog │ │ │ │ ├── bigquerysearchcatalog_test.go │ │ │ │ └── bigquerysearchcatalog.go │ │ │ └── bigquerysql │ │ │ ├── bigquerysql_test.go │ │ │ └── bigquerysql.go │ │ ├── bigtable │ │ │ ├── bigtable_test.go │ │ │ └── bigtable.go │ │ ├── cassandra │ │ │ └── cassandracql │ │ │ ├── cassandracql_test.go │ │ │ └── cassandracql.go │ │ ├── clickhouse │ │ │ ├── clickhouseexecutesql │ │ │ │ ├── clickhouseexecutesql_test.go │ │ │ │ └── clickhouseexecutesql.go │ │ │ ├── clickhouselistdatabases │ │ │ │ ├── clickhouselistdatabases_test.go │ │ │ │ └── clickhouselistdatabases.go │ │ │ ├── clickhouselisttables │ │ │ │ ├── clickhouselisttables_test.go │ │ │ │ └── clickhouselisttables.go │ │ │ └── clickhousesql │ │ │ ├── clickhousesql_test.go │ │ │ └── clickhousesql.go │ │ ├── cloudmonitoring │ │ │ ├── cloudmonitoring_test.go │ │ │ └── cloudmonitoring.go │ │ ├── cloudsql │ │ │ ├── cloudsqlcreatedatabase │ │ │ │ ├── cloudsqlcreatedatabase_test.go │ │ │ │ └── cloudsqlcreatedatabase.go │ │ │ ├── cloudsqlcreateusers │ │ │ │ ├── cloudsqlcreateusers_test.go │ │ │ │ └── cloudsqlcreateusers.go │ │ │ ├── cloudsqlgetinstances │ │ │ │ ├── cloudsqlgetinstances_test.go │ │ │ │ └── cloudsqlgetinstances.go │ │ │ ├── cloudsqllistdatabases │ │ │ │ ├── cloudsqllistdatabases_test.go │ │ │ │ └── cloudsqllistdatabases.go │ │ │ ├── cloudsqllistinstances │ │ │ │ ├── cloudsqllistinstances_test.go │ │ │ │ └── cloudsqllistinstances.go │ │ │ └── cloudsqlwaitforoperation │ │ │ ├── cloudsqlwaitforoperation_test.go │ │ │ └── cloudsqlwaitforoperation.go │ │ ├── cloudsqlmssql │ │ │ └── cloudsqlmssqlcreateinstance │ │ │ ├── cloudsqlmssqlcreateinstance_test.go │ │ │ └── cloudsqlmssqlcreateinstance.go │ │ ├── cloudsqlmysql │ │ │ └── cloudsqlmysqlcreateinstance │ │ │ ├── cloudsqlmysqlcreateinstance_test.go │ │ │ └── cloudsqlmysqlcreateinstance.go │ │ ├── cloudsqlpg │ │ │ └── cloudsqlpgcreateinstances │ │ │ ├── cloudsqlpgcreateinstances_test.go │ │ │ └── cloudsqlpgcreateinstances.go │ │ ├── common_test.go │ │ ├── common.go │ │ ├── couchbase │ │ │ ├── couchbase_test.go │ │ │ └── couchbase.go │ │ ├── dataform │ │ │ └── dataformcompilelocal │ │ │ ├── dataformcompilelocal_test.go │ │ │ └── dataformcompilelocal.go │ │ ├── dataplex │ │ │ ├── dataplexlookupentry │ │ │ │ ├── dataplexlookupentry_test.go │ │ │ │ └── dataplexlookupentry.go │ │ │ ├── dataplexsearchaspecttypes │ │ │ │ ├── dataplexsearchaspecttypes_test.go │ │ │ │ └── dataplexsearchaspecttypes.go │ │ │ └── dataplexsearchentries │ │ │ ├── dataplexsearchentries_test.go │ │ │ └── dataplexsearchentries.go │ │ ├── dgraph │ │ │ ├── dgraph_test.go │ │ │ └── dgraph.go │ │ ├── firebird │ │ │ ├── firebirdexecutesql │ │ │ │ ├── firebirdexecutesql_test.go │ │ │ │ └── firebirdexecutesql.go │ │ │ └── firebirdsql │ │ │ ├── firebirdsql_test.go │ │ │ └── firebirdsql.go │ │ ├── firestore │ │ │ ├── firestoreadddocuments │ │ │ │ ├── firestoreadddocuments_test.go │ │ │ │ └── firestoreadddocuments.go │ │ │ ├── firestoredeletedocuments │ │ │ │ ├── firestoredeletedocuments_test.go │ │ │ │ └── firestoredeletedocuments.go │ │ │ ├── firestoregetdocuments │ │ │ │ ├── firestoregetdocuments_test.go │ │ │ │ └── firestoregetdocuments.go │ │ │ ├── firestoregetrules │ │ │ │ ├── firestoregetrules_test.go │ │ │ │ └── firestoregetrules.go │ │ │ ├── firestorelistcollections │ │ │ │ ├── firestorelistcollections_test.go │ │ │ │ └── firestorelistcollections.go │ │ │ ├── firestorequery │ │ │ │ ├── firestorequery_test.go │ │ │ │ └── firestorequery.go │ │ │ ├── firestorequerycollection │ │ │ │ ├── firestorequerycollection_test.go │ │ │ │ └── firestorequerycollection.go │ │ │ ├── firestoreupdatedocument │ │ │ │ ├── firestoreupdatedocument_test.go │ │ │ │ └── firestoreupdatedocument.go │ │ │ ├── firestorevalidaterules │ │ │ │ ├── firestorevalidaterules_test.go │ │ │ │ └── firestorevalidaterules.go │ │ │ └── util │ │ │ ├── converter_test.go │ │ │ ├── converter.go │ │ │ ├── validator_test.go │ │ │ └── validator.go │ │ ├── http │ │ │ ├── http_test.go │ │ │ └── http.go │ │ ├── http_method.go │ │ ├── looker │ │ │ ├── lookeradddashboardelement │ │ │ │ ├── lookeradddashboardelement_test.go │ │ │ │ └── lookeradddashboardelement.go │ │ │ ├── lookercommon │ │ │ │ ├── lookercommon_test.go │ │ │ │ └── lookercommon.go │ │ │ ├── lookerconversationalanalytics │ │ │ │ ├── lookerconversationalanalytics_test.go │ │ │ │ └── lookerconversationalanalytics.go │ │ │ ├── lookergetdashboards │ │ │ │ ├── lookergetdashboards_test.go │ │ │ │ └── lookergetdashboards.go │ │ │ ├── lookergetdimensions │ │ │ │ ├── lookergetdimensions_test.go │ │ │ │ └── lookergetdimensions.go │ │ │ ├── lookergetexplores │ │ │ │ ├── lookergetexplores_test.go │ │ │ │ └── lookergetexplores.go │ │ │ ├── lookergetfilters │ │ │ │ ├── lookergetfilters_test.go │ │ │ │ └── lookergetfilters.go │ │ │ ├── lookergetlooks │ │ │ │ ├── lookergetlooks_test.go │ │ │ │ └── lookergetlooks.go │ │ │ ├── lookergetmeasures │ │ │ │ ├── lookergetmeasures_test.go │ │ │ │ └── lookergetmeasures.go │ │ │ ├── lookergetmodels │ │ │ │ ├── lookergetmodels_test.go │ │ │ │ └── lookergetmodels.go │ │ │ ├── lookergetparameters │ │ │ │ ├── lookergetparameters_test.go │ │ │ │ └── lookergetparameters.go │ │ │ ├── lookerhealthanalyze │ │ │ │ ├── lookerhealthanalyze_test.go │ │ │ │ └── lookerhealthanalyze.go │ │ │ ├── lookerhealthpulse │ │ │ │ ├── lookerhealthpulse_test.go │ │ │ │ └── lookerhealthpulse.go │ │ │ ├── lookerhealthvacuum │ │ │ │ ├── lookerhealthvacuum_test.go │ │ │ │ └── lookerhealthvacuum.go │ │ │ ├── lookermakedashboard │ │ │ │ ├── lookermakedashboard_test.go │ │ │ │ └── lookermakedashboard.go │ │ │ ├── lookermakelook │ │ │ │ ├── lookermakelook_test.go │ │ │ │ └── lookermakelook.go │ │ │ ├── lookerquery │ │ │ │ ├── lookerquery_test.go │ │ │ │ └── lookerquery.go │ │ │ ├── lookerquerysql │ │ │ │ ├── lookerquerysql_test.go │ │ │ │ └── lookerquerysql.go │ │ │ ├── lookerqueryurl │ │ │ │ ├── lookerqueryurl_test.go │ │ │ │ └── lookerqueryurl.go │ │ │ └── lookerrunlook │ │ │ ├── lookerrunlook_test.go │ │ │ └── lookerrunlook.go │ │ ├── mongodb │ │ │ ├── mongodbaggregate │ │ │ │ ├── mongodbaggregate_test.go │ │ │ │ └── mongodbaggregate.go │ │ │ ├── mongodbdeletemany │ │ │ │ ├── mongodbdeletemany_test.go │ │ │ │ └── mongodbdeletemany.go │ │ │ ├── mongodbdeleteone │ │ │ │ ├── mongodbdeleteone_test.go │ │ │ │ └── mongodbdeleteone.go │ │ │ ├── mongodbfind │ │ │ │ ├── mongodbfind_test.go │ │ │ │ └── mongodbfind.go │ │ │ ├── mongodbfindone │ │ │ │ ├── mongodbfindone_test.go │ │ │ │ └── mongodbfindone.go │ │ │ ├── mongodbinsertmany │ │ │ │ ├── mongodbinsertmany_test.go │ │ │ │ └── mongodbinsertmany.go │ │ │ ├── mongodbinsertone │ │ │ │ ├── mongodbinsertone_test.go │ │ │ │ └── mongodbinsertone.go │ │ │ ├── mongodbupdatemany │ │ │ │ ├── mongodbupdatemany_test.go │ │ │ │ └── mongodbupdatemany.go │ │ │ └── mongodbupdateone │ │ │ ├── mongodbupdateone_test.go │ │ │ └── mongodbupdateone.go │ │ ├── mssql │ │ │ ├── mssqlexecutesql │ │ │ │ ├── mssqlexecutesql_test.go │ │ │ │ └── mssqlexecutesql.go │ │ │ ├── mssqllisttables │ │ │ │ ├── mssqllisttables_test.go │ │ │ │ └── mssqllisttables.go │ │ │ └── mssqlsql │ │ │ ├── mssqlsql_test.go │ │ │ └── mssqlsql.go │ │ ├── mysql │ │ │ ├── mysqlcommon │ │ │ │ └── mysqlcommon.go │ │ │ ├── mysqlexecutesql │ │ │ │ ├── mysqlexecutesql_test.go │ │ │ │ └── mysqlexecutesql.go │ │ │ ├── mysqllistactivequeries │ │ │ │ ├── mysqllistactivequeries_test.go │ │ │ │ └── mysqllistactivequeries.go │ │ │ ├── mysqllisttablefragmentation │ │ │ │ ├── mysqllisttablefragmentation_test.go │ │ │ │ └── mysqllisttablefragmentation.go │ │ │ ├── mysqllisttables │ │ │ │ ├── mysqllisttables_test.go │ │ │ │ └── mysqllisttables.go │ │ │ ├── mysqllisttablesmissinguniqueindexes │ │ │ │ ├── mysqllisttablesmissinguniqueindexes_test.go │ │ │ │ └── mysqllisttablesmissinguniqueindexes.go │ │ │ └── mysqlsql │ │ │ ├── mysqlsql_test.go │ │ │ └── mysqlsql.go │ │ ├── neo4j │ │ │ ├── neo4jcypher │ │ │ │ ├── neo4jcypher_test.go │ │ │ │ └── neo4jcypher.go │ │ │ ├── neo4jexecutecypher │ │ │ │ ├── classifier │ │ │ │ │ ├── classifier_test.go │ │ │ │ │ └── classifier.go │ │ │ │ ├── neo4jexecutecypher_test.go │ │ │ │ └── neo4jexecutecypher.go │ │ │ └── neo4jschema │ │ │ ├── cache │ │ │ │ ├── cache_test.go │ │ │ │ └── cache.go │ │ │ ├── helpers │ │ │ │ ├── helpers_test.go │ │ │ │ └── helpers.go │ │ │ ├── neo4jschema_test.go │ │ │ ├── neo4jschema.go │ │ │ └── types │ │ │ └── types.go │ │ ├── oceanbase │ │ │ ├── oceanbaseexecutesql │ │ │ │ ├── oceanbaseexecutesql_test.go │ │ │ │ └── oceanbaseexecutesql.go │ │ │ └── oceanbasesql │ │ │ ├── oceanbasesql_test.go │ │ │ └── oceanbasesql.go │ │ ├── oracle │ │ │ ├── oracleexecutesql │ │ │ │ └── oracleexecutesql.go │ │ │ └── oraclesql │ │ │ └── oraclesql.go │ │ ├── parameters_test.go │ │ ├── parameters.go │ │ ├── postgres │ │ │ ├── postgresexecutesql │ │ │ │ ├── postgresexecutesql_test.go │ │ │ │ └── postgresexecutesql.go │ │ │ ├── postgreslistactivequeries │ │ │ │ ├── postgreslistactivequeries_test.go │ │ │ │ └── postgreslistactivequeries.go │ │ │ ├── postgreslistavailableextensions │ │ │ │ ├── postgreslistavailableextensions_test.go │ │ │ │ └── postgreslistavailableextensions.go │ │ │ ├── postgreslistinstalledextensions │ │ │ │ ├── postgreslistinstalledextensions_test.go │ │ │ │ └── postgreslistinstalledextensions.go │ │ │ ├── postgreslisttables │ │ │ │ ├── postgreslisttables_test.go │ │ │ │ └── postgreslisttables.go │ │ │ └── postgressql │ │ │ ├── postgressql_test.go │ │ │ └── postgressql.go │ │ ├── redis │ │ │ ├── redis_test.go │ │ │ └── redis.go │ │ ├── spanner │ │ │ ├── spannerexecutesql │ │ │ │ ├── spannerexecutesql_test.go │ │ │ │ └── spannerexecutesql.go │ │ │ ├── spannerlisttables │ │ │ │ ├── spannerlisttables_test.go │ │ │ │ └── spannerlisttables.go │ │ │ └── spannersql │ │ │ ├── spanner_test.go │ │ │ └── spannersql.go │ │ ├── sqlite │ │ │ ├── sqliteexecutesql │ │ │ │ ├── sqliteexecutesql_test.go │ │ │ │ └── sqliteexecutesql.go │ │ │ └── sqlitesql │ │ │ ├── sqlitesql_test.go │ │ │ └── sqlitesql.go │ │ ├── tidb │ │ │ ├── tidbexecutesql │ │ │ │ ├── tidbexecutesql_test.go │ │ │ │ └── tidbexecutesql.go │ │ │ └── tidbsql │ │ │ ├── tidbsql_test.go │ │ │ └── tidbsql.go │ │ ├── tools_test.go │ │ ├── tools.go │ │ ├── toolsets.go │ │ ├── trino │ │ │ ├── trinoexecutesql │ │ │ │ ├── trinoexecutesql_test.go │ │ │ │ └── trinoexecutesql.go │ │ │ └── trinosql │ │ │ ├── trinosql_test.go │ │ │ └── trinosql.go │ │ ├── utility │ │ │ └── wait │ │ │ ├── wait_test.go │ │ │ └── wait.go │ │ ├── valkey │ │ │ ├── valkey_test.go │ │ │ └── valkey.go │ │ └── yugabytedbsql │ │ ├── yugabytedbsql_test.go │ │ └── yugabytedbsql.go │ └── util │ └── util.go ├── LICENSE ├── logo.png ├── main.go ├── README.md └── tests ├── alloydb │ ├── alloydb_integration_test.go │ └── alloydb_wait_for_operation_test.go ├── alloydbainl │ └── alloydb_ai_nl_integration_test.go ├── alloydbpg │ └── alloydb_pg_integration_test.go ├── auth.go ├── bigquery │ └── bigquery_integration_test.go ├── bigtable │ └── bigtable_integration_test.go ├── cassandra │ └── cassandra_integration_test.go ├── clickhouse │ └── clickhouse_integration_test.go ├── cloudmonitoring │ └── cloud_monitoring_integration_test.go ├── cloudsql │ ├── cloud_sql_create_database_test.go │ ├── cloud_sql_create_users_test.go │ ├── cloud_sql_get_instances_test.go │ ├── cloud_sql_list_databases_test.go │ ├── cloudsql_list_instances_test.go │ └── cloudsql_wait_for_operation_test.go ├── cloudsqlmssql │ ├── cloud_sql_mssql_create_instance_integration_test.go │ └── cloud_sql_mssql_integration_test.go ├── cloudsqlmysql │ ├── cloud_sql_mysql_create_instance_integration_test.go │ └── cloud_sql_mysql_integration_test.go ├── cloudsqlpg │ ├── cloud_sql_pg_create_instances_test.go │ └── cloud_sql_pg_integration_test.go ├── common.go ├── couchbase │ └── couchbase_integration_test.go ├── dataform │ └── dataform_integration_test.go ├── dataplex │ └── dataplex_integration_test.go ├── dgraph │ └── dgraph_integration_test.go ├── firebird │ └── firebird_integration_test.go ├── firestore │ └── firestore_integration_test.go ├── http │ └── http_integration_test.go ├── looker │ └── looker_integration_test.go ├── mongodb │ └── mongodb_integration_test.go ├── mssql │ └── mssql_integration_test.go ├── mysql │ └── mysql_integration_test.go ├── neo4j │ └── neo4j_integration_test.go ├── oceanbase │ └── oceanbase_integration_test.go ├── option.go ├── oracle │ └── oracle_integration_test.go ├── postgres │ └── postgres_integration_test.go ├── redis │ └── redis_test.go ├── server.go ├── source.go ├── spanner │ └── spanner_integration_test.go ├── sqlite │ └── sqlite_integration_test.go ├── tidb │ └── tidb_integration_test.go ├── tool.go ├── trino │ └── trino_integration_test.go ├── utility │ └── wait_integration_test.go ├── valkey │ └── valkey_test.go └── yugabytedb └── yugabytedb_integration_test.go ``` # Files -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- ``` [submodule "docs2/themes/godocs"] path = docs2/themes/godocs url = https://github.com/themefisher/godocs.git ``` -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- ``` # direnv .envrc # vscode .vscode/ # idea .idea/ # npm node_modules # hugo .hugo/public/ .hugo/resources/_gen .hugo_build.lock # coverage .coverage # executable genai-toolbox toolbox ``` -------------------------------------------------------------------------------- /.golangci.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2024 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. version: "2" linters: enable: - errcheck - govet - ineffassign - staticcheck - unused exclusions: presets: - std-error-handling issues: fix: true formatters: enable: - goimports settings: gofmt: rewrite-rules: - pattern: interface{} replacement: any - pattern: a[b:len(a)] replacement: a[b:] ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- ```markdown  # MCP Toolbox for Databases [](https://googleapis.github.io/genai-toolbox/) [](https://discord.gg/Dmm69peqjh) [](https://medium.com/@mcp_toolbox) [](https://goreportcard.com/report/github.com/googleapis/genai-toolbox) > [!NOTE] > MCP Toolbox for Databases is currently in beta, and may see breaking > changes until the first stable release (v1.0). MCP Toolbox for Databases is an open source MCP server for databases. It enables you to develop tools easier, faster, and more securely by handling the complexities such as connection pooling, authentication, and more. This README provides a brief overview. For comprehensive details, see the [full documentation](https://googleapis.github.io/genai-toolbox/). > [!NOTE] > This solution was originally named “Gen AI Toolbox for Databases” as > its initial development predated MCP, but was renamed to align with recently > added MCP compatibility. <!-- TOC ignore:true --> ## Table of Contents <!-- TOC --> - [Why Toolbox?](#why-toolbox) - [General Architecture](#general-architecture) - [Getting Started](#getting-started) - [Installing the server](#installing-the-server) - [Running the server](#running-the-server) - [Integrating your application](#integrating-your-application) - [Configuration](#configuration) - [Sources](#sources) - [Tools](#tools) - [Toolsets](#toolsets) - [Versioning](#versioning) - [Pre-1.0.0 Versioning](#pre-100-versioning) - [Post-1.0.0 Versioning](#post-100-versioning) - [Contributing](#contributing) - [Community](#community) <!-- /TOC --> ## Why Toolbox? Toolbox helps you build Gen AI tools that let your agents access data in your database. Toolbox provides: - **Simplified development**: Integrate tools to your agent in less than 10 lines of code, reuse tools between multiple agents or frameworks, and deploy new versions of tools more easily. - **Better performance**: Best practices such as connection pooling, authentication, and more. - **Enhanced security**: Integrated auth for more secure access to your data - **End-to-end observability**: Out of the box metrics and tracing with built-in support for OpenTelemetry. **⚡ Supercharge Your Workflow with an AI Database Assistant ⚡** Stop context-switching and let your AI assistant become a true co-developer. By [connecting your IDE to your databases with MCP Toolbox][connect-ide], you can delegate complex and time-consuming database tasks, allowing you to build faster and focus on what matters. This isn't just about code completion; it's about giving your AI the context it needs to handle the entire development lifecycle. Here’s how it will save you time: - **Query in Plain English**: Interact with your data using natural language right from your IDE. Ask complex questions like, *"How many orders were delivered in 2024, and what items were in them?"* without writing any SQL. - **Automate Database Management**: Simply describe your data needs, and let the AI assistant manage your database for you. It can handle generating queries, creating tables, adding indexes, and more. - **Generate Context-Aware Code**: Empower your AI assistant to generate application code and tests with a deep understanding of your real-time database schema. This accelerates the development cycle by ensuring the generated code is directly usable. - **Slash Development Overhead**: Radically reduce the time spent on manual setup and boilerplate. MCP Toolbox helps streamline lengthy database configurations, repetitive code, and error-prone schema migrations. Learn [how to connect your AI tools (IDEs) to Toolbox using MCP][connect-ide]. [connect-ide]: https://googleapis.github.io/genai-toolbox/how-to/connect-ide/ ## General Architecture Toolbox sits between your application's orchestration framework and your database, providing a control plane that is used to modify, distribute, or invoke tools. It simplifies the management of your tools by providing you with a centralized location to store and update tools, allowing you to share tools between agents and applications and update those tools without necessarily redeploying your application.  ## Getting Started ### Installing the server For the latest version, check the [releases page][releases] and use the following instructions for your OS and CPU architecture. [releases]: https://github.com/googleapis/genai-toolbox/releases <details open> <summary>Binary</summary> To install Toolbox as a binary: <!-- {x-release-please-start-version} --> > <details> > <summary>Linux (AMD64)</summary> > > To install Toolbox as a binary on Linux (AMD64): > > ```sh > # see releases page for other versions > export VERSION=0.17.0 > curl -L -o toolbox https://storage.googleapis.com/genai-toolbox/v$VERSION/linux/amd64/toolbox > chmod +x toolbox > ``` > > </details> > <details> > <summary>macOS (Apple Silicon)</summary> > > To install Toolbox as a binary on macOS (Apple Silicon): > > ```sh > # see releases page for other versions > export VERSION=0.17.0 > curl -L -o toolbox https://storage.googleapis.com/genai-toolbox/v$VERSION/darwin/arm64/toolbox > chmod +x toolbox > ``` > > </details> > <details> > <summary>macOS (Intel)</summary> > > To install Toolbox as a binary on macOS (Intel): > > ```sh > # see releases page for other versions > export VERSION=0.17.0 > curl -L -o toolbox https://storage.googleapis.com/genai-toolbox/v$VERSION/darwin/amd64/toolbox > chmod +x toolbox > ``` > > </details> > <details> > <summary>Windows (AMD64)</summary> > > To install Toolbox as a binary on Windows (AMD64): > > ```powershell > # see releases page for other versions > $VERSION = "0.17.0" > Invoke-WebRequest -Uri "https://storage.googleapis.com/genai-toolbox/v$VERSION/windows/amd64/toolbox.exe" -OutFile "toolbox.exe" > ``` > > </details> </details> <details> <summary>Container image</summary> You can also install Toolbox as a container: ```sh # see releases page for other versions export VERSION=0.17.0 docker pull us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$VERSION ``` </details> <details> <summary>Homebrew</summary> To install Toolbox using Homebrew on macOS or Linux: ```sh brew install mcp-toolbox ``` </details> <details> <summary>Compile from source</summary> To install from source, ensure you have the latest version of [Go installed](https://go.dev/doc/install), and then run the following command: ```sh go install github.com/googleapis/[email protected] ``` <!-- {x-release-please-end} --> </details> <details> <summary>Gemini CLI Extensions</summary> To install Gemini CLI Extensions for MCP Toolbox, run the following command: ```sh gemini extensions install https://github.com/gemini-cli-extensions/mcp-toolbox ``` </details> ### Running the server [Configure](#configuration) a `tools.yaml` to define your tools, and then execute `toolbox` to start the server: <details open> <summary>Binary</summary> To run Toolbox from binary: ```sh ./toolbox --tools-file "tools.yaml" ``` ⓘ **NOTE:** Toolbox enables dynamic reloading by default. To disable, use the `--disable-reload` flag. </details> <details> <summary>Container image</summary> To run the server after pulling the [container image](#installing-the-server): ```sh export VERSION=0.11.0 # Use the version you pulled docker run -p 5000:5000 \ -v $(pwd)/tools.yaml:/app/tools.yaml \ us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$VERSION \ --tools-file "/app/tools.yaml" ``` ⓘ **NOTE:** The `-v` flag mounts your local `tools.yaml` into the container, and `-p` maps the container's port `5000` to your host's port `5000`. </details> <details> <summary>Source</summary> To run the server directly from source, navigate to the project root directory and run: ```sh go run . ``` ⓘ **NOTE:** This command runs the project from source, and is more suitable for development and testing. It does **not** compile a binary into your `$GOPATH`. If you want to compile a binary instead, refer the [Developer Documentation](./DEVELOPER.md#building-the-binary). </details> <details> <summary>Homebrew</summary> If you installed Toolbox using [Homebrew](https://brew.sh/), the `toolbox` binary is available in your system path. You can start the server with the same command: ```sh toolbox --tools-file "tools.yaml" ``` </details> <details> <summary>Gemini CLI</summary> Interact with your custom tools using natural language. Check [gemini-cli-extensions/mcp-toolbox](https://github.com/gemini-cli-extensions/mcp-toolbox) for more information. </details> 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 [How-to section](https://googleapis.github.io/genai-toolbox/how-to/) ### Integrating your application Once your server is up and running, you can load the tools into your application. See below the list of Client SDKs for using various frameworks: <details open> <summary>Python (<a href="https://github.com/googleapis/mcp-toolbox-sdk-python">Github</a>)</summary> <br> <blockquote> <details open> <summary>Core</summary> 1. Install [Toolbox Core SDK][toolbox-core]: ```bash pip install toolbox-core ``` 1. Load tools: ```python from toolbox_core import ToolboxClient # update the url to point to your server async with ToolboxClient("http://127.0.0.1:5000") as client: # these tools can be passed to your application! tools = await client.load_toolset("toolset_name") ``` For more detailed instructions on using the Toolbox Core SDK, see the [project's README][toolbox-core-readme]. [toolbox-core]: https://pypi.org/project/toolbox-core/ [toolbox-core-readme]: https://github.com/googleapis/mcp-toolbox-sdk-python/tree/main/packages/toolbox-core/README.md </details> <details> <summary>LangChain / LangGraph</summary> 1. Install [Toolbox LangChain SDK][toolbox-langchain]: ```bash pip install toolbox-langchain ``` 1. Load tools: ```python from toolbox_langchain import ToolboxClient # update the url to point to your server async with ToolboxClient("http://127.0.0.1:5000") as client: # these tools can be passed to your application! tools = client.load_toolset() ``` For more detailed instructions on using the Toolbox LangChain SDK, see the [project's README][toolbox-langchain-readme]. [toolbox-langchain]: https://pypi.org/project/toolbox-langchain/ [toolbox-langchain-readme]: https://github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-langchain/README.md </details> <details> <summary>LlamaIndex</summary> 1. Install [Toolbox Llamaindex SDK][toolbox-llamaindex]: ```bash pip install toolbox-llamaindex ``` 1. Load tools: ```python from toolbox_llamaindex import ToolboxClient # update the url to point to your server async with ToolboxClient("http://127.0.0.1:5000") as client: # these tools can be passed to your application! tools = client.load_toolset() ``` For more detailed instructions on using the Toolbox Llamaindex SDK, see the [project's README][toolbox-llamaindex-readme]. [toolbox-llamaindex]: https://pypi.org/project/toolbox-llamaindex/ [toolbox-llamaindex-readme]: https://github.com/googleapis/genai-toolbox-llamaindex-python/blob/main/README.md </details> </details> </blockquote> <details> <summary>Javascript/Typescript (<a href="https://github.com/googleapis/mcp-toolbox-sdk-js">Github</a>)</summary> <br> <blockquote> <details open> <summary>Core</summary> 1. Install [Toolbox Core SDK][toolbox-core-js]: ```bash npm install @toolbox-sdk/core ``` 1. Load tools: ```javascript import { ToolboxClient } from '@toolbox-sdk/core'; // update the url to point to your server const URL = 'http://127.0.0.1:5000'; let client = new ToolboxClient(URL); // these tools can be passed to your application! const tools = await client.loadToolset('toolsetName'); ``` For more detailed instructions on using the Toolbox Core SDK, see the [project's README][toolbox-core-js-readme]. [toolbox-core-js]: https://www.npmjs.com/package/@toolbox-sdk/core [toolbox-core-js-readme]: https://github.com/googleapis/mcp-toolbox-sdk-js/blob/main/packages/toolbox-core/README.md </details> <details> <summary>LangChain / LangGraph</summary> 1. Install [Toolbox Core SDK][toolbox-core-js]: ```bash npm install @toolbox-sdk/core ``` 2. Load tools: ```javascript import { ToolboxClient } from '@toolbox-sdk/core'; // update the url to point to your server const URL = 'http://127.0.0.1:5000'; let client = new ToolboxClient(URL); // these tools can be passed to your application! const toolboxTools = await client.loadToolset('toolsetName'); // Define the basics of the tool: name, description, schema and core logic const getTool = (toolboxTool) => tool(currTool, { name: toolboxTool.getName(), description: toolboxTool.getDescription(), schema: toolboxTool.getParamSchema() }); // Use these tools in your Langchain/Langraph applications const tools = toolboxTools.map(getTool); ``` </details> <details> <summary>Genkit</summary> 1. Install [Toolbox Core SDK][toolbox-core-js]: ```bash npm install @toolbox-sdk/core ``` 2. Load tools: ```javascript import { ToolboxClient } from '@toolbox-sdk/core'; import { genkit } from 'genkit'; // Initialise genkit const ai = genkit({ plugins: [ googleAI({ apiKey: process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY }) ], model: googleAI.model('gemini-2.0-flash'), }); // update the url to point to your server const URL = 'http://127.0.0.1:5000'; let client = new ToolboxClient(URL); // these tools can be passed to your application! const toolboxTools = await client.loadToolset('toolsetName'); // Define the basics of the tool: name, description, schema and core logic const getTool = (toolboxTool) => ai.defineTool({ name: toolboxTool.getName(), description: toolboxTool.getDescription(), schema: toolboxTool.getParamSchema() }, toolboxTool) // Use these tools in your Genkit applications const tools = toolboxTools.map(getTool); ``` </details> </details> </blockquote> <details> <summary>Go (<a href="https://github.com/googleapis/mcp-toolbox-sdk-go">Github</a>)</summary> <br> <blockquote> <details open> <summary>Core</summary> 1. Install [Toolbox Go SDK][toolbox-go]: ```bash go get github.com/googleapis/mcp-toolbox-sdk-go ``` 1. Load tools: ```go package main import ( "github.com/googleapis/mcp-toolbox-sdk-go/core" "context" ) func main() { // Make sure to add the error checks // update the url to point to your server URL := "http://127.0.0.1:5000"; ctx := context.Background() client, err := core.NewToolboxClient(URL) // Framework agnostic tools tools, err := client.LoadToolset("toolsetName", ctx) } ``` For more detailed instructions on using the Toolbox Go SDK, see the [project's README][toolbox-core-go-readme]. [toolbox-go]: https://pkg.go.dev/github.com/googleapis/mcp-toolbox-sdk-go/core [toolbox-core-go-readme]: https://github.com/googleapis/mcp-toolbox-sdk-go/blob/main/core/README.md </details> <details> <summary>LangChain Go</summary> 1. Install [Toolbox Go SDK][toolbox-go]: ```bash go get github.com/googleapis/mcp-toolbox-sdk-go ``` 2. Load tools: ```go package main import ( "context" "encoding/json" "github.com/googleapis/mcp-toolbox-sdk-go/core" "github.com/tmc/langchaingo/llms" ) func main() { // Make sure to add the error checks // update the url to point to your server URL := "http://127.0.0.1:5000" ctx := context.Background() client, err := core.NewToolboxClient(URL) // Framework agnostic tool tool, err := client.LoadTool("toolName", ctx) // Fetch the tool's input schema inputschema, err := tool.InputSchema() var paramsSchema map[string]any _ = json.Unmarshal(inputschema, ¶msSchema) // Use this tool with LangChainGo langChainTool := llms.Tool{ Type: "function", Function: &llms.FunctionDefinition{ Name: tool.Name(), Description: tool.Description(), Parameters: paramsSchema, }, } } ``` </details> <details> <summary>Genkit</summary> 1. Install [Toolbox Go SDK][toolbox-go]: ```bash go get github.com/googleapis/mcp-toolbox-sdk-go ``` 2. Load tools: ```go package main import ( "context" "log" "github.com/firebase/genkit/go/genkit" "github.com/googleapis/mcp-toolbox-sdk-go/core" "github.com/googleapis/mcp-toolbox-sdk-go/tbgenkit" ) func main() { // Make sure to add the error checks // Update the url to point to your server URL := "http://127.0.0.1:5000" ctx := context.Background() g := genkit.Init(ctx) client, err := core.NewToolboxClient(URL) // Framework agnostic tool tool, err := client.LoadTool("toolName", ctx) // Convert the tool using the tbgenkit package // Use this tool with Genkit Go genkitTool, err := tbgenkit.ToGenkitTool(tool, g) if err != nil { log.Fatalf("Failed to convert tool: %v\n", err) } log.Printf("Successfully converted tool: %s", genkitTool.Name()) } ``` </details> <details> <summary>Go GenAI</summary> 1. Install [Toolbox Go SDK][toolbox-go]: ```bash go get github.com/googleapis/mcp-toolbox-sdk-go ``` 2. Load tools: ```go package main import ( "context" "encoding/json" "github.com/googleapis/mcp-toolbox-sdk-go/core" "google.golang.org/genai" ) func main() { // Make sure to add the error checks // Update the url to point to your server URL := "http://127.0.0.1:5000" ctx := context.Background() client, err := core.NewToolboxClient(URL) // Framework agnostic tool tool, err := client.LoadTool("toolName", ctx) // Fetch the tool's input schema inputschema, err := tool.InputSchema() var schema *genai.Schema _ = json.Unmarshal(inputschema, &schema) funcDeclaration := &genai.FunctionDeclaration{ Name: tool.Name(), Description: tool.Description(), Parameters: schema, } // Use this tool with Go GenAI genAITool := &genai.Tool{ FunctionDeclarations: []*genai.FunctionDeclaration{funcDeclaration}, } } ``` </details> <details> <summary>OpenAI Go</summary> 1. Install [Toolbox Go SDK][toolbox-go]: ```bash go get github.com/googleapis/mcp-toolbox-sdk-go ``` 2. Load tools: ```go package main import ( "context" "encoding/json" "github.com/googleapis/mcp-toolbox-sdk-go/core" openai "github.com/openai/openai-go" ) func main() { // Make sure to add the error checks // Update the url to point to your server URL := "http://127.0.0.1:5000" ctx := context.Background() client, err := core.NewToolboxClient(URL) // Framework agnostic tool tool, err := client.LoadTool("toolName", ctx) // Fetch the tool's input schema inputschema, err := tool.InputSchema() var paramsSchema openai.FunctionParameters _ = json.Unmarshal(inputschema, ¶msSchema) // Use this tool with OpenAI Go openAITool := openai.ChatCompletionToolParam{ Function: openai.FunctionDefinitionParam{ Name: tool.Name(), Description: openai.String(tool.Description()), Parameters: paramsSchema, }, } } ``` </details> </details> </blockquote> </details> ## Configuration The primary way to configure Toolbox is through the `tools.yaml` file. If you have multiple files, you can tell toolbox which to load with the `--tools-file tools.yaml` flag. You can find more detailed reference documentation to all resource types in the [Resources](https://googleapis.github.io/genai-toolbox/resources/). ### Sources The `sources` section of your `tools.yaml` defines what data sources your Toolbox should have access to. Most tools will have at least one source to execute against. ```yaml sources: my-pg-source: kind: postgres host: 127.0.0.1 port: 5432 database: toolbox_db user: toolbox_user password: my-password ``` For more details on configuring different types of sources, see the [Sources](https://googleapis.github.io/genai-toolbox/resources/sources). ### Tools The `tools` section of a `tools.yaml` define the actions an agent can take: what kind of tool it is, which source(s) it affects, what parameters it uses, etc. ```yaml tools: search-hotels-by-name: kind: postgres-sql source: my-pg-source description: Search for hotels based on name. parameters: - name: name type: string description: The name of the hotel. statement: SELECT * FROM hotels WHERE name ILIKE '%' || $1 || '%'; ``` For more details on configuring different types of tools, see the [Tools](https://googleapis.github.io/genai-toolbox/resources/tools). ### Toolsets The `toolsets` section of your `tools.yaml` allows you to define groups of tools that you want to be able to load together. This can be useful for defining different groups based on agent or application. ```yaml toolsets: my_first_toolset: - my_first_tool - my_second_tool my_second_toolset: - my_second_tool - my_third_tool ``` You can load toolsets by name: ```python # This will load all tools all_tools = client.load_toolset() # This will only load the tools listed in 'my_second_toolset' my_second_toolset = client.load_toolset("my_second_toolset") ``` ## Versioning This project uses [semantic versioning](https://semver.org/) (`MAJOR.MINOR.PATCH`). Since the project is in a pre-release stage (version `0.x.y`), we follow the standard conventions for initial development: ### Pre-1.0.0 Versioning While the major version is `0`, the public API should be considered unstable. The version will be incremented as follows: - **`0.MINOR.PATCH`**: The **MINOR** version is incremented when we add new functionality or make breaking, incompatible API changes. - **`0.MINOR.PATCH`**: The **PATCH** version is incremented for backward-compatible bug fixes. ### Post-1.0.0 Versioning Once the project reaches a stable `1.0.0` release, the versioning will follow the more common convention: - **`MAJOR.MINOR.PATCH`**: Incremented for incompatible API changes. - **`MAJOR.MINOR.PATCH`**: Incremented for new, backward-compatible functionality. - **`MAJOR.MINOR.PATCH`**: Incremented for backward-compatible bug fixes. The public API that this applies to is the CLI associated with Toolbox, the interactions with official SDKs, and the definitions in the `tools.yaml` file. ## Contributing Contributions are welcome. Please, see the [CONTRIBUTING](CONTRIBUTING.md) to get started. Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms. See [Contributor Code of Conduct](CODE_OF_CONDUCT.md) for more information. ## Community Join our [discord community](https://discord.gg/GQrFB3Ec3W) to connect with our developers! ``` -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- ```markdown # Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. This Code of Conduct also applies outside the project spaces when the Project Steward has a reasonable belief that an individual's behavior may have a negative impact on the project or its community. ## Conflict Resolution We do not believe that all conflict is bad; healthy debate and disagreement often yield positive results. However, it is never okay to be disrespectful or to engage in behavior that violates the project’s code of conduct. If you see someone violating the code of conduct, you are encouraged to address the behavior directly with those involved. Many issues can be resolved quickly and easily, and this gives people more control over the outcome of their dispute. If you are unable to resolve the matter for any reason, or if the behavior is threatening or harassing, report it. We are dedicated to providing an environment where participants feel welcome and safe. Reports should be directed to @googleapis/senseai-eco, the Project Steward(s) for *Project Toolbox*. It is the Project Steward’s duty to receive and address reported violations of the code of conduct. They will then work with a committee consisting of representatives from the Open Source Programs Office and the Google Open Source Strategy team. If for any reason you are uncomfortable reaching out to the Project Steward, please email <[email protected]>. We will investigate every complaint, but you may not receive a direct response. We will use our discretion in determining when and how to follow up on reported incidents, which may range from not taking action to permanent expulsion from the project and project-sponsored spaces. We will notify the accused of the report and provide them an opportunity to discuss it before any action is taken. The identity of the reporter will be omitted from the details of the report supplied to the accused. In potentially harmful situations, such as ongoing harassment or threats to anyone's safety, we may take action without notice. ## Attribution This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html> ``` -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- ```markdown # How to contribute We'd love to accept your patches and contributions to this project. ## Before you begin ### Sign our Contributor License Agreement Contributions to this project must be accompanied by a [Contributor License Agreement](https://cla.developers.google.com/about) (CLA). You (or your employer) retain the copyright to your contribution; this simply gives us permission to use and redistribute your contributions as part of the project. If you or your current employer have already signed the Google CLA (even if it was for a different project), you probably don't need to do it again. Visit <https://cla.developers.google.com/> to see your current agreements or to sign a new one. ### Review our community guidelines This project follows [Google's Open Source Community Guidelines](https://opensource.google/conduct/). ## Contribution process > [!NOTE] > New contributions should always include both unit and integration tests. All submissions, including submissions by project members, require review. We use GitHub pull requests for this purpose. Consult [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more information on using pull requests. ### Code reviews * Within 2-5 days, a reviewer will review your PR. They may approve it, or request changes. * When requesting changes, reviewers should self-assign the PR to ensure they are aware of any updates. * If additional changes are needed, push additional commits to your PR branch - this helps the reviewer know which parts of the PR have changed. * Commits will be squashed when merged. * Please follow up with changes promptly. * If a PR is awaiting changes by the author for more than 10 days, maintainers may mark that PR as Draft. PRs that are inactive for more than 30 days may be closed. ## Adding a New Database Source or Tool Please create an [issue](https://github.com/googleapis/genai-toolbox/issues) before implementation to ensure we can accept the contribution and no duplicated work. This issue should include an overview of the API design. If you have any questions, reach out on our [Discord](https://discord.gg/Dmm69peqjh) to chat directly with the team. > [!NOTE] > New tools can be added for [pre-existing data > sources](https://github.com/googleapis/genai-toolbox/tree/main/internal/sources). > However, any new database source should also include at least one new tool > type. ### Adding a New Database Source We recommend looking at an [example source implementation](https://github.com/googleapis/genai-toolbox/blob/main/internal/sources/postgres/postgres.go). * **Create a new directory** under `internal/sources` for your database type (e.g., `internal/sources/newdb`). * **Define a configuration struct** for your data source in a file named `newdb.go`. Create a `Config` struct to include all the necessary parameters for connecting to the database (e.g., host, port, username, password, database name) and a `Source` struct to store necessary parameters for tools (e.g., Name, Kind, connection object, additional config). * **Implement the [`SourceConfig`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/sources/sources.go#L57) interface**. This interface requires two methods: * `SourceConfigKind() string`: Returns a unique string identifier for your data source (e.g., `"newdb"`). * `Initialize(ctx context.Context, tracer trace.Tracer) (Source, error)`: Creates a new instance of your data source and establishes a connection to the database. * **Implement the [`Source`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/sources/sources.go#L63) interface**. This interface requires one method: * `SourceKind() string`: Returns the same string identifier as `SourceConfigKind()`. * **Implement `init()`** to register the new Source. * **Implement Unit Tests** in a file named `newdb_test.go`. ### Adding a New Tool > [!NOTE] > Please follow the tool naming convention detailed [here](./DEVELOPER.md#tool-naming-conventions). We recommend looking at an [example tool implementation](https://github.com/googleapis/genai-toolbox/tree/main/internal/tools/postgres/postgressql). * **Create a new directory** under `internal/tools` for your tool type (e.g., `internal/tools/newdb` or `internal/tools/newdb<tool_name>`). * **Define a configuration struct** for your tool in a file named `newdbtool.go`. Create a `Config` struct and a `Tool` struct to store necessary parameters for tools. * **Implement the [`ToolConfig`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/tools/tools.go#L61) interface**. This interface requires one method: * `ToolConfigKind() string`: Returns a unique string identifier for your tool (e.g., `"newdb"`). * `Initialize(sources map[string]Source) (Tool, error)`: Creates a new instance of your tool and validates that it can connect to the specified data source. * **Implement the `Tool` interface**. This interface requires the following methods: * `Invoke(ctx context.Context, params map[string]any) ([]any, error)`: Executes the operation on the database using the provided parameters. * `ParseParams(data map[string]any, claims map[string]map[string]any) (ParamValues, error)`: Parses and validates the input parameters. * `Manifest() Manifest`: Returns a manifest describing the tool's capabilities and parameters. * `McpManifest() McpManifest`: Returns an MCP manifest describing the tool for use with the Model Context Protocol. * `Authorized(services []string) bool`: Checks if the tool is authorized to run based on the provided authentication services. * **Implement `init()`** to register the new Tool. * **Implement Unit Tests** in a file named `newdb_test.go`. ### Adding Integration Tests * **Add a test file** under a new directory `tests/newdb`. * **Add pre-defined integration test suites** in the `/tests/newdb/newdb_test.go` that are **required** to be run as long as your code contains related features. Please check each test suites for the config defaults, if your source require test suites config updates, please refer to [config option](./tests/option.go): 1. [RunToolGetTest][tool-get]: tests for the `GET` endpoint that returns the tool's manifest. 2. [RunToolInvokeTest][tool-call]: tests for tool calling through the native Toolbox endpoints. 3. [RunMCPToolCallMethod][mcp-call]: tests tool calling through the MCP endpoints. 4. (Optional) [RunExecuteSqlToolInvokeTest][execute-sql]: tests an `execute-sql` tool for any source. Only run this test if you are adding an `execute-sql` tool. 5. (Optional) [RunToolInvokeWithTemplateParameters][temp-param]: tests for [template parameters][temp-param-doc]. Only run this test if template parameters apply to your tool. * **Add the new database to the integration test workflow** in [integration.cloudbuild.yaml](.ci/integration.cloudbuild.yaml). [tool-get]: https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/tests/tool.go#L31 [tool-call]: <https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/tests/tool.go#L79> [mcp-call]: https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/tests/tool.go#L554 [execute-sql]: <https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/tests/tool.go#L431> [temp-param]: <https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/tests/tool.go#L297> [temp-param-doc]: https://googleapis.github.io/genai-toolbox/resources/tools/#template-parameters ### Adding Documentation * **Update the documentation** to include information about your new data source and tool. This includes: * Adding a new page to the `docs/en/resources/sources` directory for your data source. * Adding a new page to the `docs/en/resources/tools` directory for your tool. * **(Optional) Add samples** to the `docs/en/samples/<newdb>` directory. ### (Optional) Adding Prebuilt Tools You can provide developers with a set of "build-time" tools to aid common software development user journeys like viewing and creating tables/collections and data. * **Create a set of prebuilt tools** by defining a new `tools.yaml` and adding it to `internal/tools`. Make sure the file name matches the source (i.e. for source "alloydb-postgres" create a file named "alloydb-postgres.yaml"). * **Update `cmd/root.go`** to add new source to the `prebuilt` flag. * **Add tests** in [internal/prebuiltconfigs/prebuiltconfigs_test.go](internal/prebuiltconfigs/prebuiltconfigs_test.go) and [cmd/root_test.go](cmd/root_test.go). ## Submitting a Pull Request Submit a pull request to the repository with your changes. Be sure to include a detailed description of your changes and any requests for long term testing resources. * **Title:** All pull request title should follow the formatting of [Conventional Commit](https://www.conventionalcommits.org/) guidelines: `<type>[optional scope]: description`. For example, if you are adding a new field in postgres source, the title should be `feat(source/postgres): add support for "new-field" field in postgres source`. Here are some commonly used `type` in this GitHub repo. | **type** | **description** | |-----------------|-------------------------------------------------------------------------------------------------------| | Breaking Change | Anything with this type of a `!` after the type/scope introduces a breaking change. | | feat | Adding a new feature to the codebase. | | fix | Fixing a bug or typo in the codebase. This does not include fixing docs. | | test | Changes made to test files. | | ci | Changes made to the cicd configuration files or scripts. | | docs | Documentation-related PRs, including fixes on docs. | | chore | Other small tasks or updates that don't fall into any of the above types. | | refactor | Change src code but unlike feat, there are no tests broke and no line lost coverage. | | revert | Revert changes made in another commit. | | style | Update src code, with only formatting and whitespace updates (e.g. code formatter or linter changes). | Pull requests should always add scope whenever possible. The scope is formatted as `<scope-type>/<scope-kind>` (e.g., `sources/postgres`, or `tools/mssql-sql`). Ideally, **each PR covers only one scope**, if this is inevitable, multiple scopes can be seaparated with a comma (e.g. `sources/postgres,sources/alloydbpg`). If the PR covers multiple `scope-type` (such as adding a new database), you can disregard the `scope-type`, e.g. `feat(new-db): adding support for new-db source and tool`. * **PR Description:** PR description should **always** be included. It should include a concise description of the changes, it's impact, along with a summary of the solution. If the PR is related to a specific issue, the issue number should be mentioned in the PR description (e.g. `Fixes #1`). ``` -------------------------------------------------------------------------------- /cmd/version.txt: -------------------------------------------------------------------------------- ``` 0.17.0 ``` -------------------------------------------------------------------------------- /.github/label-sync.yml: -------------------------------------------------------------------------------- ```yaml --- ignored: true ``` -------------------------------------------------------------------------------- /.hugo/assets/scss/_styles_project.scss: -------------------------------------------------------------------------------- ```scss @import 'td/code-dark'; ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/golden.txt: -------------------------------------------------------------------------------- ``` Hilton Basel Hyatt Regency book ``` -------------------------------------------------------------------------------- /.hugo/assets/scss/_variables_project.scss: -------------------------------------------------------------------------------- ```scss $primary: #80a7e9; $secondary: #4484f4; ``` -------------------------------------------------------------------------------- /.hugo/layouts/partials/td/render-heading.html: -------------------------------------------------------------------------------- ```html {{ template "partials/td/render-heading.html" . }} ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/python/adk/requirements.txt: -------------------------------------------------------------------------------- ``` google-adk==1.15.0 toolbox-core==0.5.2 pytest==8.4.2 ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/python/core/requirements.txt: -------------------------------------------------------------------------------- ``` google-genai==1.42.0 toolbox-core==0.5.2 pytest==8.4.2 ``` -------------------------------------------------------------------------------- /.hugo/layouts/robot.txt: -------------------------------------------------------------------------------- ``` User-agent: * {{ if eq hugo.Environment "preview" }} Disallow: /* {{ end }} ``` -------------------------------------------------------------------------------- /.hugo/layouts/partials/hooks/head-end.html: -------------------------------------------------------------------------------- ```html <script src='{{ .Site.BaseURL }}js/w3.js' type="application/x-javascript"></script> ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/alloydbainl/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "AlloyDB AI NL" type: docs weight: 1 description: > AlloyDB AI NL Tool. --- ``` -------------------------------------------------------------------------------- /docs/en/concepts/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Concepts" type: docs weight: 2 description: > Some core concepts in Toolbox --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/dataform/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Dataform" type: docs weight: 1 description: > Tools that work with Dataform. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/http/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "HTTP" type: docs weight: 1 description: > Tools that work with HTTP Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/python/llamaindex/requirements.txt: -------------------------------------------------------------------------------- ``` llama-index==0.14.3 llama-index-llms-google-genai==0.6.0 toolbox-llamaindex==0.5.2 pytest==8.4.2 ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/neo4j/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Neo4j" type: docs weight: 1 description: > Tools that work with Neo4j Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/redis/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Redis" type: docs weight: 1 description: > Tools that work with Redis Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/utility/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Utility tools" type: docs weight: 1 description: > Tools that provide utility. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudsql/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Cloud SQL" type: docs weight: 1 description: > Tools that work with Cloud SQL. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/dgraph/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Dgraph" type: docs weight: 1 description: > Tools that work with Dgraph Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/looker/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Looker" type: docs weight: 1 description: > Tools that work with Looker Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/sqlite/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "SQLite" type: docs weight: 1 description: > Tools that work with SQLite Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/valkey/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Valkey" type: docs weight: 1 description: > Tools that work with Valkey Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/oracle/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Oracle" type: docs weight: 1 description: > Tools that work with Oracle Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/spanner/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Spanner" type: docs weight: 1 description: > Tools that work with Spanner Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/samples/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Samples" type: docs weight: 5 description: > Samples and guides for using Toolbox. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/bigquery/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "BigQuery" type: docs weight: 1 description: > Tools that work with BigQuery Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/bigtable/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Bigtable" type: docs weight: 1 description: > Tools that work with Bigtable Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/dataplex/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Dataplex" type: docs weight: 1 description: > Tools that work with Dataplex Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firebird/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Firebird" type: docs weight: 1 description: > Tools that work with Firebird Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/yuagbytedb/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "YugabyteDB" type: docs weight: 1 description: > Tools that work with Valkey Sources. --- ``` -------------------------------------------------------------------------------- /.hugo/archetypes/default.md: -------------------------------------------------------------------------------- ```markdown +++ date = '{{ .Date }}' draft = true title = '{{ replace .File.ContentBaseName "-" " " | title }}' +++ ``` -------------------------------------------------------------------------------- /docs/en/getting-started/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Getting Started" type: docs weight: 1 description: > How to get started with Toolbox. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/mongodb/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "MongoDB" type: docs weight: 1 description: > Tools that work with the MongoDB Source. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cassandra/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Cassandra" type: docs weight: 1 description: > Tools that work with Cassandra Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/couchbase/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Couchbase" type: docs weight: 1 description: > Tools that work with Couchbase Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firestore/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Firestore" type: docs weight: 1 description: > Tools that work with Firestore Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/oceanbase/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "OceanBase" type: docs weight: 1 description: > Tools that work with OceanBase Sources. --- ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/python/langchain/requirements.txt: -------------------------------------------------------------------------------- ``` langchain==0.3.27 langchain-google-vertexai==2.1.2 langgraph==0.6.8 toolbox-langchain==0.5.2 pytest==8.4.2 ``` -------------------------------------------------------------------------------- /docs/en/samples/looker/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Looker" type: docs weight: 1 description: > How to get started with Toolbox using Looker. --- ``` -------------------------------------------------------------------------------- /docs/en/about/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "About" type: docs weight: 6 description: > A list of other information related to Toolbox. --- ``` -------------------------------------------------------------------------------- /docs/en/samples/alloydb/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "AlloyDB" type: docs weight: 1 description: > How to get started with Toolbox using AlloyDB. --- ``` -------------------------------------------------------------------------------- /docs/en/sdks/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "SDKs" type: docs weight: 6 description: > Client SDKs to connect to the MCP Toolbox server. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/alloydb/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "AlloyDB for PostgreSQL" type: docs weight: 1 description: > Tools for AlloyDB for PostgreSQL. --- ``` -------------------------------------------------------------------------------- /docs/en/samples/bigquery/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "BigQuery" type: docs weight: 1 description: > How to get started with Toolbox using BigQuery. --- ``` -------------------------------------------------------------------------------- /docs/en/reference/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Reference" type: docs weight: 7 description: > This section contains reference documentation. --- ``` -------------------------------------------------------------------------------- /.hugo/package.json: -------------------------------------------------------------------------------- ```json { "devDependencies": { "autoprefixer": "^10.4.20", "postcss": "^8.4.49", "postcss-cli": "^11.0.0" } } ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudmonitoring/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Cloud Monitoring" type: docs weight: 1 description: > Tools that work with Cloud Monitoring source. --- ``` -------------------------------------------------------------------------------- /.hugo/layouts/shortcodes/include.html: -------------------------------------------------------------------------------- ```html {{ $file := .Get 0 }} {{ (printf "%s%s" .Page.File.Dir $file) | readFile | replaceRE "^---[\\s\\S]+?---" "" | safeHTML }} ``` -------------------------------------------------------------------------------- /docs/en/resources/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Resources" type: docs weight: 4 description: > List of reference documentation for resources in Toolbox. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/clickhouse/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "ClickHouse" type: docs weight: 1 description: > Tools for interacting with ClickHouse databases and tables. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/mysql/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "MySQL" type: docs weight: 1 description: > Tools that work with MySQL Sources, such as Cloud SQL for MySQL. --- ``` -------------------------------------------------------------------------------- /docs/en/how-to/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "How-to" type: docs weight: 3 description: > List of guides detailing how to do different things with Toolbox. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/trino/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Trino" type: docs weight: 1 description: > Tools that work with Trino Sources, such as distributed SQL query engine. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/tidb/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "TiDB" type: docs weight: 1 description: > Tools that work with TiDB Sources, such as TiDB Cloud and self-hosted TiDB. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/mssql/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "SQL Server" type: docs weight: 1 description: > Tools that work with SQL Server Sources, such as CloudSQL for SQL Server. --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/postgres/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Postgres" type: docs weight: 1 description: > Tools that work with Postgres Sources, such as Cloud SQL for Postgres and AlloyDB. --- ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/python/__init__.py: -------------------------------------------------------------------------------- ```python # This file makes the 'quickstart' directory a Python package. # You can include any package-level initialization logic here if needed. # For now, this file is empty. ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Connect from your IDE" type: docs weight: 1 description: > List of guides detailing how to connect your AI tools (IDEs) to Toolbox using MCP. aliases: - /how-to/connect_tools_using_mcp --- ``` -------------------------------------------------------------------------------- /docs/en/samples/alloydb/ai-nl/index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Getting started with alloydb-ai-nl tool" type: docs weight: 30 description: > An end to end tutorial for building an ADK agent using the AlloyDB AI NL tool. --- {{< ipynb "alloydb_ai_nl.ipynb" >}} ``` -------------------------------------------------------------------------------- /.hugo/layouts/index.llms-full.txt: -------------------------------------------------------------------------------- ``` {{ .Site.Params.description }} {{ range .Site.Sections }} # {{ .Title }} {{ .Description }} {{ range .Pages }} # {{ .Title }} {{ .Description }} {{ .RawContent }} {{ range .Pages }} # {{ .Title }} {{ .Description }} {{ .RawContent }} {{end }}{{ end }}{{ end }} ``` -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- ```yaml blank_issues_enabled: false contact_links: - name: Google Cloud Support url: https://cloud.google.com/support/ about: If you have a support contract with Google, please both open an issue here and open Google Cloud Support portal with a link to the issue. ``` -------------------------------------------------------------------------------- /docs/en/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Documentation" type: docs notoc: false weight: 1 description: > All of Toolbox's documentation. --- <html> <head> <link rel="canonical" href="getting-started/introduction/"/> <meta http-equiv="refresh" content="0;url=getting-started/introduction/"/> </head> </html> ``` -------------------------------------------------------------------------------- /.hugo/layouts/index.llms.txt: -------------------------------------------------------------------------------- ``` # {{ .Site.Title }} > {{ .Site.Params.description }} ## Docs {{ range .Site.Sections }} ### {{ .Title }} {{ .Description }}{{ range .Pages }}- [{{ .Title }}]({{ .Permalink }}): {{ .Description }}{{ range .Pages }} - [{{ .Title }}]({{ .Permalink }}): {{ .Description }}{{end }}{{ end }}{{ end }} ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/js/genAI/package.json: -------------------------------------------------------------------------------- ```json { "name": "genai", "version": "1.0.0", "description": "", "main": "quickstart.js", "type" : "module", "scripts": { "test": "node --test" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@google/genai": "^1.17.0", "@toolbox-sdk/core": "^0.1.2" } } ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/js/genkit/package.json: -------------------------------------------------------------------------------- ```json { "name": "genkit", "version": "1.0.0", "description": "", "main": "quickstart.js", "type" : "module", "scripts": { "test": "node --test" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@genkit-ai/googleai": "^1.18.0", "@toolbox-sdk/core": "^0.1.2", "genkit": "^1.18.0" } } ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/alloydb_pg_mcp.md: -------------------------------------------------------------------------------- ```markdown --- title: "AlloyDB using MCP" type: docs weight: 2 description: > Connect your IDE to AlloyDB using Toolbox. --- <html> <head> <link rel="canonical" href="https://cloud.google.com/alloydb/docs/connect-ide-using-mcp-toolbox"/> <meta http-equiv="refresh" content="0;url=https://cloud.google.com/alloydb/docs/connect-ide-using-mcp-toolbox"/> </head> </html> ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/spanner_mcp.md: -------------------------------------------------------------------------------- ```markdown --- title: "Spanner using MCP" type: docs weight: 2 description: > Connect your IDE to Spanner using Toolbox. --- <html> <head> <link rel="canonical" href="https://cloud.google.com/spanner/docs/pre-built-tools-with-mcp-toolbox"/> <meta http-equiv="refresh" content="0;url=https://cloud.google.com/spanner/docs/pre-built-tools-with-mcp-toolbox"/> </head> </html> ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/bigquery_mcp.md: -------------------------------------------------------------------------------- ```markdown --- title: "BigQuery using MCP" type: docs weight: 2 description: > Connect your IDE to BigQuery using Toolbox. --- <html> <head> <link rel="canonical" href="https://cloud.google.com/bigquery/docs/pre-built-tools-with-mcp-toolbox"/> <meta http-equiv="refresh" content="0;url=https://cloud.google.com/bigquery/docs/pre-built-tools-with-mcp-toolbox"/> </head> </html> ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/js/llamaindex/package.json: -------------------------------------------------------------------------------- ```json { "name": "llamaindex", "version": "1.0.0", "description": "", "main": "quickstart.js", "type": "module", "scripts": { "test": "node --test" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@llamaindex/google": "^0.3.20", "@llamaindex/workflow": "^1.1.22", "@toolbox-sdk/core": "^0.1.2", "llamaindex": "^0.12.0" } } ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/js/langchain/package.json: -------------------------------------------------------------------------------- ```json { "name": "langchain", "version": "1.0.0", "description": "", "main": "quickstart.js", "type": "module", "scripts": { "test": "node --test" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@langchain/google-genai": "^0.2.17", "@langchain/langgraph": "^0.4.9", "@toolbox-sdk/core": "^0.1.2", "langchain": "^0.3.33" } } ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/alloydb_pg_admin_mcp.md: -------------------------------------------------------------------------------- ```markdown --- title: "AlloyDB Admin API using MCP" type: docs weight: 2 description: > Create your AlloyDB database with MCP Toolbox. --- <html> <head> <link rel="canonical" href="https://cloud.google.com/alloydb/docs/create-database-with-mcp-toolbox"/> <meta http-equiv="refresh" content="0;url=https://cloud.google.com/alloydb/docs/create-database-with-mcp-toolbox"/> </head> </html> ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/firestore_mcp.md: -------------------------------------------------------------------------------- ```markdown --- title: "Firestore using MCP" type: docs weight: 2 description: > Connect your IDE to Firestore using Toolbox. --- <html> <head> <link rel="canonical" href="https://cloud.google.com/firestore/native/docs/connect-ide-using-mcp-toolbox"/> <meta http-equiv="refresh" content="0;url=https://cloud.google.com/firestore/native/docs/connect-ide-using-mcp-toolbox"/> </head> </html> ``` -------------------------------------------------------------------------------- /docs/en/sdks/go-sdk.md: -------------------------------------------------------------------------------- ```markdown --- title: "Go SDK" weight: 2 description: Go lang client SDK icon: fa-brands fa-golang manualLink: "https://github.com/googleapis/mcp-toolbox-sdk-go" manualLinkTarget: _blank --- <html> <head> <link rel="canonical" href="https://github.com/googleapis/mcp-toolbox-sdk-go"/> <meta http-equiv="refresh" content="0;url=https://github.com/googleapis/mcp-toolbox-sdk-go"/> </head> </html> ``` -------------------------------------------------------------------------------- /docs/en/sdks/js-sdk.md: -------------------------------------------------------------------------------- ```markdown --- title: "JS SDK" weight: 2 description: Javascript client SDK icon: fa-brands fa-node-js manualLink: "https://github.com/googleapis/mcp-toolbox-sdk-js" manualLinkTarget: _blank --- <html> <head> <link rel="canonical" href="https://github.com/googleapis/mcp-toolbox-sdk-js"/> <meta http-equiv="refresh" content="0;url=https://github.com/googleapis/mcp-toolbox-sdk-js"/> </head> </html> ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/cloud_sql_mysql_mcp.md: -------------------------------------------------------------------------------- ```markdown --- title: "Cloud SQL for MySQL using MCP" type: docs weight: 2 description: > Connect your IDE to Cloud SQL for MySQL using Toolbox. --- <html> <head> <link rel="canonical" href="https://cloud.google.com/sql/docs/mysql/pre-built-tools-with-mcp-toolbox"/> <meta http-equiv="refresh" content="0;url=https://cloud.google.com/sql/docs/mysql/pre-built-tools-with-mcp-toolbox"/> </head> </html> ``` -------------------------------------------------------------------------------- /docs/en/sdks/python-sdk.md: -------------------------------------------------------------------------------- ```markdown --- title: "Python SDK" weight: 2 description: Python client SDK icon: fa-brands fa-python manualLink: "https://github.com/googleapis/mcp-toolbox-sdk-python" manualLinkTarget: _blank --- <html> <head> <link rel="canonical" href="https://github.com/googleapis/mcp-toolbox-sdk-python"/> <meta http-equiv="refresh" content="0;url=https://github.com/googleapis/mcp-toolbox-sdk-python"/> </head> </html> ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/cloud_sql_pg_mcp.md: -------------------------------------------------------------------------------- ```markdown --- title: "Cloud SQL for Postgres using MCP" type: docs weight: 2 description: > Connect your IDE to Cloud SQL for Postgres using Toolbox. --- <html> <head> <link rel="canonical" href="https://cloud.google.com/sql/docs/postgres/pre-built-tools-with-mcp-toolbox"/> <meta http-equiv="refresh" content="0;url=https://cloud.google.com/sql/docs/postgres/pre-built-tools-with-mcp-toolbox"/> </head> </html> ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/cloud_sql_mssql_mcp.md: -------------------------------------------------------------------------------- ```markdown --- title: "Cloud SQL for SQL Server using MCP" type: docs weight: 2 description: > Connect your IDE to Cloud SQL for SQL Server using Toolbox. --- <html> <head> <link rel="canonical" href="https://cloud.google.com/sql/docs/sqlserver/pre-built-tools-with-mcp-toolbox"/> <meta http-equiv="refresh" content="0;url=https://cloud.google.com/sql/docs/sqlserver/pre-built-tools-with-mcp-toolbox"/> </head> </html> ``` -------------------------------------------------------------------------------- /.github/renovate.json5: -------------------------------------------------------------------------------- ``` { extends: [ 'config:recommended', ':semanticCommitTypeAll(chore)', ':ignoreUnstable', ':separateMajorReleases', ':prConcurrentLimitNone', ':prHourlyLimitNone', ':preserveSemverRanges', ], minimumReleaseAge: '3', rebaseWhen: 'conflicted', dependencyDashboardLabels: [ 'type: process', ], "postUpdateOptions": [ "gomodTidy" ], packageRules: [ { groupName: 'GitHub Actions', matchManagers: [ 'github-actions', ], pinDigests: true, }, ], } ``` -------------------------------------------------------------------------------- /.hugo/layouts/partials/navbar-version-selector.html: -------------------------------------------------------------------------------- ```html {{ if .Site.Params.versions -}} <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> {{ .Site.Params.version_menu }} </a> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> <div w3-include-html="/genai-toolbox/releases.releases" w3-include-html-default='<a class="dropdown-item" href="/genai-toolbox/dev/">Dev</a>'></div> <script> // This must run after the w3.js script has loaded. w3.includeHTML(); </script> </div> {{ end -}} ``` -------------------------------------------------------------------------------- /.github/auto-label.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2024 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 # # https://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. enabled: false ``` -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- ```go // Copyright 2024 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 ( "github.com/googleapis/genai-toolbox/cmd" ) func main() { cmd.Execute() } ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/shared/cloud_setup.md: -------------------------------------------------------------------------------- ```markdown <!-- This file has been used in local_quickstart.md, local_quickstart_go.md & local_quickstart_js.md --> <!-- [START cloud_setup] --> If you plan to use **Google Cloud’s Vertex AI** with your agent (e.g., using `vertexai=True` or a Google GenAI model), follow these one-time setup steps for local development: 1. [Install the Google Cloud CLI](https://cloud.google.com/sdk/docs/install) 1. [Set up Application Default Credentials (ADC)](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment) 1. Set your project and enable Vertex AI ```bash gcloud config set project YOUR_PROJECT_ID gcloud services enable aiplatform.googleapis.com ``` <!-- [END cloud_setup] --> ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/oracle/oracle-execute-sql.md: -------------------------------------------------------------------------------- ```markdown --- title: "oracle-execute-sql" type: docs weight: 1 description: > An "oracle-execute-sql" tool executes a SQL statement against an Oracle database. aliases: - /resources/tools/oracle-execute-sql --- ## About An `oracle-execute-sql` tool executes a SQL statement against an Oracle database. It's compatible with the following source: - [oracle](../../sources/oracle.md) `oracle-execute-sql` takes one input parameter `sql` and runs the sql statement against the `source`. > **Note:** This tool is intended for developer assistant workflows with > human-in-the-loop and shouldn't be used for production agents. ## Example ```yaml tools: execute_sql_tool: kind: oracle-execute-sql source: my-oracle-instance description: Use this tool to execute sql statement. ``` -------------------------------------------------------------------------------- /.github/header-checker-lint.yml: -------------------------------------------------------------------------------- ```yaml # Copyright 2024 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 # # https://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. allowedCopyrightHolders: - 'Google LLC' - 'Oracle' allowedLicenses: - 'Apache-2.0' sourceFileExtensions: - 'go' - 'yaml' - 'yml' ignoreFiles: - 'docs/en/getting-started/quickstart/**' - '**/*oracle*' ``` -------------------------------------------------------------------------------- /cmd/options.go: -------------------------------------------------------------------------------- ```go // Copyright 2024 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 cmd import ( "io" ) // Option is a function that configures a Command. type Option func(*Command) // WithStreams overrides the default writer. func WithStreams(out, err io.Writer) Option { return func(c *Command) { c.outStream = out c.errStream = err } } ``` -------------------------------------------------------------------------------- /internal/server/static/index.html: -------------------------------------------------------------------------------- ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Toolbox UI</title> <link rel="stylesheet" href="/ui/css/style.css"> </head> <body> <div id="navbar-container" data-active-nav=""></div> <div id="main-content-container"></div> <script src="/ui/js/navbar.js"></script> <script src="/ui/js/mainContent.js"></script> <script> document.addEventListener('DOMContentLoaded', () => { const navbarContainer = document.getElementById('navbar-container'); const activeNav = navbarContainer.getAttribute('data-active-nav'); renderNavbar('navbar-container', activeNav); renderMainContent('main-content-container', 'homepage-info', getHomepageInstructions()) }); </script> </body> </html> ``` -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- ```markdown ## Description > Should include a concise description of the changes (bug or feature), it's > impact, along with a summary of the solution ## PR Checklist > Thank you for opening a Pull Request! Before submitting your PR, there are a > few things you can do to make sure it goes smoothly: - [ ] Make sure you reviewed [CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md) - [ ] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [ ] Ensure the tests and linter pass - [ ] Code coverage does not decrease (if any source code was changed) - [ ] Appropriate docs were updated (if necessary) - [ ] Make sure to add `!` if this involve a breaking change 🛠️ Fixes #<issue_number_goes_here> ``` -------------------------------------------------------------------------------- /.github/blunderbuss.yml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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 # # https://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. assign_issues: - Yuan325 - duwenxin99 - averikitsch - anubhav756 - dishaprakash - twishabansal assign_issues_by: - labels: - 'product: bigquery' to: - Genesis929 - shobsi - jiaxunwu - labels: - 'product: looker' to: - drstrangelooker assign_prs: - Yuan325 - duwenxin99 - averikitsch ``` -------------------------------------------------------------------------------- /.github/workflows/schedule_reporter.yml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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. name: Schedule Reporter on: schedule: - cron: '0 6 * * *' # Runs at 6 AM every morning jobs: run_reporter: permissions: issues: 'write' checks: 'read' contents: 'read' uses: ./.github/workflows/cloud_build_failure_reporter.yml with: trigger_names: "toolbox-test-nightly,toolbox-test-on-merge,toolbox-continuous-release" ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudsql/cloudsqlgetinstances.md: -------------------------------------------------------------------------------- ```markdown --- title: "cloud-sql-get-instance" type: docs weight: 10 description: > Get a Cloud SQL instance resource. --- The `cloud-sql-get-instance` tool retrieves a Cloud SQL instance resource using the Cloud SQL Admin API. {{< notice info >}} This tool uses a `source` of kind `cloud-sql-admin`. {{< /notice >}} ## Example ```yaml tools: get-sql-instance: kind: cloud-sql-get-instance source: my-cloud-sql-admin-source description: "Gets a particular cloud sql instance." ``` ## Reference | **field** | **type** | **required** | **description** | | ----------- | :------: | :----------: | ------------------------------------------------ | | kind | string | true | Must be "cloud-sql-get-instance". | | source | string | true | The name of the `cloud-sql-admin` source to use. | | description | string | false | A description of the tool. | ``` -------------------------------------------------------------------------------- /docs/en/resources/sources/_index.md: -------------------------------------------------------------------------------- ```markdown --- title: "Sources" type: docs weight: 1 description: > Sources represent your different data sources that a tool can interact with. --- A Source represents a data sources that a tool can interact with. You can define Sources as a map in the `sources` section of your `tools.yaml` file. Typically, a source configuration will contain any information needed to connect with and interact with the database. {{< notice tip >}} Use environment variable replacement with the format ${ENV_NAME} instead of hardcoding your secrets into the configuration file. {{< /notice >}} ```yaml sources: my-cloud-sql-source: kind: cloud-sql-postgres project: my-project-id region: us-central1 instance: my-instance-name database: my_db user: ${USER_NAME} password: ${PASSWORD} ``` In implementation, each source is a different connection pool or client that used to connect to the database and execute the tool. ## Available Sources ``` -------------------------------------------------------------------------------- /internal/server/mcp/jsonrpc/jsonrpc_test.go: -------------------------------------------------------------------------------- ```go // Copyright 2025 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 jsonrpc import ( "reflect" "testing" ) func TestNewError(t *testing.T) { var id interface{} = "foo" code := 111 message := "foo bar" want := JSONRPCError{ Jsonrpc: "2.0", Id: "foo", Error: Error{ Code: 111, Message: "foo bar", }, } got := NewError(id, code, message, nil) if !reflect.DeepEqual(want, got) { t.Fatalf("unexpected error: got %+v, want %+v", got, want) } } ``` -------------------------------------------------------------------------------- /internal/auth/auth.go: -------------------------------------------------------------------------------- ```go // Copyright 2024 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 auth import ( "context" "net/http" ) // AuthServiceConfig is the interface for configuring authentication services. type AuthServiceConfig interface { AuthServiceConfigKind() string Initialize() (AuthService, error) } // AuthService is the interface for authentication services. type AuthService interface { AuthServiceKind() string GetName() string GetClaimsFromHeader(context.Context, http.Header) (map[string]any, error) } ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/neo4j.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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. sources: neo4j-source: kind: neo4j uri: ${NEO4J_URI} database: ${NEO4J_DATABASE} user: ${NEO4J_USERNAME} password: ${NEO4J_PASSWORD} tools: execute_cypher: kind: neo4j-execute-cypher source: neo4j-source description: Use this tool to execute Cypher queries. get_schema: kind: neo4j-schema source: neo4j-source description: Use this tool to get the database schema. toolsets: neo4j_database_tools: - execute_cypher - get_schema ``` -------------------------------------------------------------------------------- /docs/en/resources/sources/mongodb.md: -------------------------------------------------------------------------------- ```markdown --- title: "MongoDB" 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. --- ## 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/ ## Example ```yaml sources: my-mongodb: kind: mongodb uri: "mongodb+srv://username:[email protected]" ``` ## Reference | **field** | **type** | **required** | **description** | |-----------|:--------:|:------------:|-------------------------------------------------------------------| | kind | string | true | Must be "mongodb". | | uri | string | true | connection string to connect to MongoDB | ``` -------------------------------------------------------------------------------- /.github/workflows/sync-labels.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2024 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. name: Sync Labels on: push: branches: - main # Declare default permissions as read only. permissions: read-all jobs: build: runs-on: ubuntu-latest permissions: contents: 'read' issues: 'write' pull-requests: 'write' steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - uses: micnncim/action-label-syncer@3abd5ab72fda571e69fffd97bd4e0033dd5f495c # v1.3.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: manifest: .github/labels.yaml ``` -------------------------------------------------------------------------------- /internal/sources/ip_type.go: -------------------------------------------------------------------------------- ```go // Copyright 2024 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 sources import ( "context" "fmt" "strings" ) type IPType string func (i *IPType) String() string { if string(*i) != "" { return strings.ToLower(string(*i)) } return "public" } func (i *IPType) UnmarshalYAML(ctx context.Context, unmarshal func(interface{}) error) error { var ipType string if err := unmarshal(&ipType); err != nil { return err } switch strings.ToLower(ipType) { case "private", "public", "psc": *i = IPType(strings.ToLower(ipType)) return nil default: return fmt.Errorf(`ipType invalid: must be one of "public", "private", or "psc"`) } } ``` -------------------------------------------------------------------------------- /internal/server/static/tools.html: -------------------------------------------------------------------------------- ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Tools View</title> <link rel="stylesheet" href="/ui/css/style.css"> <script src="https://accounts.google.com/gsi/client" async defer></script> </head> <body> <div id="navbar-container" data-active-nav="/ui/tools"></div> <aside class="second-nav"> <h4>My Tools</h4> <div id="secondary-panel-content"> <p>Fetching tools...</p> </div> </aside> <div id="main-content-container"></div> <script type="module" src="/ui/js/tools.js"></script> <script src="/ui/js/navbar.js"></script> <script src="/ui/js/mainContent.js"></script> <script> document.addEventListener('DOMContentLoaded', () => { const navbarContainer = document.getElementById('navbar-container'); const activeNav = navbarContainer.getAttribute('data-active-nav'); renderNavbar('navbar-container', activeNav); renderMainContent('main-content-container', 'tool-display-area', getToolInstructions()) }); </script> </body> </html> ``` -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- ```dockerfile # Copyright 2024 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. # Use the latest stable golang 1.x to compile to a binary FROM --platform=$BUILDPLATFORM golang:1 AS build WORKDIR /go/src/genai-toolbox COPY . . ARG TARGETOS ARG TARGETARCH ARG BUILD_TYPE="container.dev" ARG COMMIT_SHA="" RUN go get ./... RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \ go build -ldflags "-X github.com/googleapis/genai-toolbox/cmd.buildType=${BUILD_TYPE} -X github.com/googleapis/genai-toolbox/cmd.commitSha=${COMMIT_SHA}" # Final Stage FROM gcr.io/distroless/static:nonroot WORKDIR /app COPY --from=build --chown=nonroot /go/src/genai-toolbox/genai-toolbox /toolbox USER nonroot ENTRYPOINT ["/toolbox"] ``` -------------------------------------------------------------------------------- /internal/log/logger.go: -------------------------------------------------------------------------------- ```go // Copyright 2024 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 log import ( "context" ) // Logger is the interface used throughout the project for logging. type Logger interface { // DebugContext is for reporting additional information about internal operations. DebugContext(ctx context.Context, format string, args ...interface{}) // InfoContext is for reporting informational messages. InfoContext(ctx context.Context, format string, args ...interface{}) // WarnContext is for reporting warning messages. WarnContext(ctx context.Context, format string, args ...interface{}) // ErrorContext is for reporting errors. ErrorContext(ctx context.Context, format string, args ...interface{}) } ``` -------------------------------------------------------------------------------- /internal/sources/dialect.go: -------------------------------------------------------------------------------- ```go // Copyright 2024 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 sources import ( "context" "fmt" "strings" ) // Dialect represents the dialect type of a database. type Dialect string func (i *Dialect) String() string { if string(*i) != "" { return strings.ToLower(string(*i)) } return "googlesql" } func (i *Dialect) UnmarshalYAML(ctx context.Context, unmarshal func(interface{}) error) error { var dialect string if err := unmarshal(&dialect); err != nil { return err } switch strings.ToLower(dialect) { case "googlesql", "postgresql": *i = Dialect(strings.ToLower(dialect)) return nil default: return fmt.Errorf(`dialect invalid: must be one of "googlesql", or "postgresql"`) } } ``` -------------------------------------------------------------------------------- /internal/server/static/js/tools.js: -------------------------------------------------------------------------------- ```javascript // Copyright 2025 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 { loadTools } from "./loadTools.js"; /** * These functions runs after the browser finishes loading and parsing HTML structure. * This ensures that elements can be safely accessed. */ document.addEventListener('DOMContentLoaded', () => { const toolDisplayArea = document.getElementById('tool-display-area'); const secondaryPanelContent = document.getElementById('secondary-panel-content'); const DEFAULT_TOOLSET = ""; // will return all toolsets if (!secondaryPanelContent || !toolDisplayArea) { console.error('Required DOM elements not found.'); return; } loadTools(secondaryPanelContent, toolDisplayArea, DEFAULT_TOOLSET); }); ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/utility/wait.md: -------------------------------------------------------------------------------- ```markdown --- title: "wait" type: docs weight: 1 description: > A "wait" tool pauses execution for a specified duration. aliases: - /resources/tools/utility/wait --- ## About A `wait` tool pauses execution for a specified duration. This can be useful in workflows where a delay is needed between steps. `wait` takes one input parameter `duration` which is a string representing the time to wait (e.g., "10s", "2m", "1h"). {{< notice info >}} This tool is intended for developer assistant workflows with human-in-the-loop and shouldn't be used for production agents. {{< /notice >}} ## Example ```yaml tools: wait_for_tool: kind: wait description: Use this tool to pause execution for a specified duration. timeout: 30s ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------------:|:------------:|-------------------------------------------------------| | kind | string | true | Must be "wait". | | description | string | true | Description of the tool that is passed to the LLM. | | timeout | string | true | The default duration the tool can wait for. | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/dataplex.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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. sources: dataplex-source: kind: "dataplex" project: ${DATAPLEX_PROJECT} tools: search_entries: kind: dataplex-search-entries source: dataplex-source description: Use this tool to search for entries in Dataplex Catalog based on the provided search query. lookup_entry: kind: dataplex-lookup-entry source: dataplex-source description: Use this tool to retrieve a specific entry from Dataplex Catalog. search_aspect_types: kind: dataplex-search-aspect-types source: dataplex-source description: Use this tool to find aspect types relevant to the query. toolsets: dataplex_tools: - search_entries - lookup_entry - search_aspect_types ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/oceanbase/oceanbase-execute-sql.md: -------------------------------------------------------------------------------- ```markdown --- title: "oceanbase-execute-sql" type: docs weight: 1 description: > An "oceanbase-execute-sql" tool executes a SQL statement against an OceanBase database. aliases: - /resources/tools/oceanbase-execute-sql --- ## About An `oceanbase-execute-sql` tool executes a SQL statement against an OceanBase database. It's compatible with the following source: - [oceanbase](../sources/oceanbase.md) `oceanbase-execute-sql` takes one input parameter `sql` and runs the sql statement against the `source`. > **Note:** This tool is intended for developer assistant workflows with > human-in-the-loop and shouldn't be used for production agents. ## Example ```yaml tools: execute_sql_tool: kind: oceanbase-execute-sql source: my-oceanbase-instance description: Use this tool to execute sql statement. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------:|:------------:|----------------------------------------------------| | kind | string | true | Must be "oceanbase-execute-sql". | | source | string | true | Name of the source the SQL should execute on. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firebird/firebird-execute-sql.md: -------------------------------------------------------------------------------- ```markdown --- title: "firebird-execute-sql" type: docs weight: 1 description: > A "firebird-execute-sql" tool executes a SQL statement against a Firebird database. aliases: - /resources/tools/firebird-execute-sql --- ## About A `firebird-execute-sql` tool executes a SQL statement against a Firebird database. It's compatible with the following source: - [firebird](../sources/firebird.md) `firebird-execute-sql` takes one input parameter `sql` and runs the sql statement against the `source`. > **Note:** This tool is intended for developer assistant workflows with > human-in-the-loop and shouldn't be used for production agents. ## Example ```yaml tools: execute_sql_tool: kind: firebird-execute-sql source: my_firebird_db description: Use this tool to execute a SQL statement against the Firebird database. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------:|:------------:|----------------------------------------------------| | kind | string | true | Must be "firebird-execute-sql". | | source | string | true | Name of the source the SQL should execute on. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/mssql.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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. sources: mssql-source: kind: mssql host: ${MSSQL_HOST} port: ${MSSQL_PORT} database: ${MSSQL_DATABASE} user: ${MSSQL_USER} password: ${MSSQL_PASSWORD} tools: execute_sql: kind: mssql-execute-sql source: mssql-source description: Use this tool to execute SQL. list_tables: kind: mssql-list-tables source: mssql-source description: "Lists detailed schema information (object type, columns, constraints, indexes, triggers, comment) as JSON for user-created tables (ordinary or partitioned). Filters by a comma-separated list of names. If names are omitted, lists all tables in user schemas." toolsets: mssql_database_tools: - execute_sql - list_tables ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudsql/cloudsqlcreateusers.md: -------------------------------------------------------------------------------- ```markdown --- title: cloud-sql-create-users type: docs weight: 10 description: > Create a new user in a Cloud SQL instance. --- The `cloud-sql-create-users` tool creates a new user in a specified Cloud SQL instance. It can create both built-in and IAM users. {{< notice info >}} This tool uses a `source` of kind `cloud-sql-admin`. {{< /notice >}} ## Example ```yaml tools: create-cloud-sql-user: kind: cloud-sql-create-users source: my-cloud-sql-admin-source description: "Creates a new user in a Cloud SQL instance. Both built-in and IAM users are supported. IAM users require an email account as the user name. IAM is the more secure and recommended way to manage users. The agent should always ask the user what type of user they want to create. For more information, see https://cloud.google.com/sql/docs/postgres/add-manage-iam-users" ``` ## Reference | **field** | **type** | **required** | **description** | | ------------ | :-------: | :----------: | ------------------------------------------------ | | kind | string | true | Must be "cloud-sql-create-users". | | description | string | false | A description of the tool. | | source | string | true | The name of the `cloud-sql-admin` source to use. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/sqlite/sqlite-execute-sql.md: -------------------------------------------------------------------------------- ```markdown --- title: "sqlite-execute-sql" type: docs weight: 1 description: > A "sqlite-execute-sql" tool executes a single SQL statement against a SQLite database. aliases: - /resources/tools/sqlite-execute-sql --- ## About A `sqlite-execute-sql` tool executes a single SQL statement against a SQLite database. It's compatible with any of the following sources: - [sqlite](../../sources/sqlite.md) This tool is designed for direct execution of SQL statements. It takes a single `sql` input parameter and runs the SQL statement against the configured SQLite `source`. > **Note:** This tool is intended for developer assistant workflows with > human-in-the-loop and shouldn't be used for production agents. ## Example ```yaml tools: execute_sql_tool: kind: sqlite-execute-sql source: my-sqlite-db description: Use this tool to execute a SQL statement. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------:|:------------:|----------------------------------------------------| | kind | string | true | Must be "sqlite-execute-sql". | | source | string | true | Name of the source the SQL should execute on. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firestore/firestore-get-rules.md: -------------------------------------------------------------------------------- ```markdown --- title: "firestore-get-rules" type: docs weight: 1 description: > A "firestore-get-rules" tool retrieves the active Firestore security rules for the current project. aliases: - /resources/tools/firestore-get-rules --- ## About A `firestore-get-rules` tool retrieves the active [Firestore security rules](https://firebase.google.com/docs/firestore/security/get-started) for the current project. It's compatible with the following sources: - [firestore](../../sources/firestore.md) `firestore-get-rules` takes no input parameters and returns the security rules content along with metadata such as the ruleset name, and timestamps. ## Example ```yaml tools: get_firestore_rules: kind: firestore-get-rules source: my-firestore-source description: Use this tool to retrieve the active Firestore security rules. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:-------------:|:------------:|-------------------------------------------------------| | kind | string | true | Must be "firestore-get-rules". | | source | string | true | Name of the Firestore source to retrieve rules from. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/clickhouse.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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. sources: clickhouse-source: kind: clickhouse host: ${CLICKHOUSE_HOST} port: ${CLICKHOUSE_PORT} user: ${CLICKHOUSE_USER} password: ${CLICKHOUSE_PASSWORD} database: ${CLICKHOUSE_DATABASE} protocol: ${CLICKHOUSE_PROTOCOL} tools: execute_sql: kind: clickhouse-execute-sql source: clickhouse-source description: Use this tool to execute SQL. list_databases: kind: clickhouse-list-databases source: clickhouse-source description: Use this tool to list all databases in ClickHouse. list_tables: kind: clickhouse-list-tables source: clickhouse-source description: Use this tool to list all tables in a specific ClickHouse database. toolsets: clickhouse_database_tools: - execute_sql - list_databases - list_tables ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firestore/firestore-get-documents.md: -------------------------------------------------------------------------------- ```markdown --- title: "firestore-get-documents" type: docs weight: 1 description: > A "firestore-get-documents" tool retrieves multiple documents from Firestore by their paths. aliases: - /resources/tools/firestore-get-documents --- ## About A `firestore-get-documents` tool retrieves multiple documents from Firestore by their paths. It's compatible with the following sources: - [firestore](../../sources/firestore.md) `firestore-get-documents` takes one input parameter `documentPaths` which is an array of document paths, and returns the documents' data along with metadata such as existence status, creation time, update time, and read time. ## Example ```yaml tools: get_user_documents: kind: firestore-get-documents source: my-firestore-source description: Use this tool to retrieve multiple documents from Firestore. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------------:|:------------:|------------------------------------------------------------| | kind | string | true | Must be "firestore-get-documents". | | source | string | true | Name of the Firestore source to retrieve documents from. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /tests/auth.go: -------------------------------------------------------------------------------- ```go // Copyright 2024 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 tests import ( "context" "os" "os/exec" "strings" "google.golang.org/api/idtoken" ) var ServiceAccountEmail = os.Getenv("SERVICE_ACCOUNT_EMAIL") var ClientId = os.Getenv("CLIENT_ID") // GetGoogleIdToken retrieve and return the Google ID token func GetGoogleIdToken(audience string) (string, error) { // For local testing - use gcloud command to print personal ID token cmd := exec.Command("gcloud", "auth", "print-identity-token") output, err := cmd.Output() if err == nil { return strings.TrimSpace(string(output)), nil } // For Cloud Build testing - retrieve ID token from GCE metadata server ts, err := idtoken.NewTokenSource(context.Background(), ClientId) if err != nil { return "", err } token, err := ts.Token() if err != nil { return "", err } return token.AccessToken, nil } ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firestore/firestore-delete-documents.md: -------------------------------------------------------------------------------- ```markdown --- title: "firestore-delete-documents" type: docs weight: 1 description: > A "firestore-delete-documents" tool deletes multiple documents from Firestore by their paths. aliases: - /resources/tools/firestore-delete-documents --- ## About A `firestore-delete-documents` tool deletes multiple documents from Firestore by their paths. It's compatible with the following sources: - [firestore](../../sources/firestore.md) `firestore-delete-documents` takes one input parameter `documentPaths` which is an array of document paths to delete. The tool uses Firestore's BulkWriter for efficient batch deletion and returns the success status for each document. ## Example ```yaml tools: delete_user_documents: kind: firestore-delete-documents source: my-firestore-source description: Use this tool to delete multiple documents from Firestore. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------------:|:------------:|----------------------------------------------------------| | kind | string | true | Must be "firestore-delete-documents". | | source | string | true | Name of the Firestore source to delete documents from. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /internal/server/web.go: -------------------------------------------------------------------------------- ```go package server import ( "bytes" "embed" "fmt" "io" "io/fs" "net/http" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" ) //go:embed all:static var staticContent embed.FS // webRouter creates a router that represents the routes under /ui func webRouter() (chi.Router, error) { r := chi.NewRouter() r.Use(middleware.StripSlashes) // direct routes for html pages to provide clean URLs r.Get("/", func(w http.ResponseWriter, r *http.Request) { serveHTML(w, r, "static/index.html") }) r.Get("/tools", func(w http.ResponseWriter, r *http.Request) { serveHTML(w, r, "static/tools.html") }) r.Get("/toolsets", func(w http.ResponseWriter, r *http.Request) { serveHTML(w, r, "static/toolsets.html") }) // handler for all other static files/assets staticFS, _ := fs.Sub(staticContent, "static") r.Handle("/*", http.StripPrefix("/ui", http.FileServer(http.FS(staticFS)))) return r, nil } func serveHTML(w http.ResponseWriter, r *http.Request, filepath string) { file, err := staticContent.Open(filepath) if err != nil { http.Error(w, "File not found", http.StatusNotFound) return } defer file.Close() fileBytes, err := io.ReadAll(file) if err != nil { http.Error(w, fmt.Sprintf("Error reading file: %v", err), http.StatusInternalServerError) return } fileInfo, err := file.Stat() if err != nil { return } http.ServeContent(w, r, fileInfo.Name(), fileInfo.ModTime(), bytes.NewReader(fileBytes)) } ``` -------------------------------------------------------------------------------- /internal/tools/mysql/mysqlcommon/mysqlcommon.go: -------------------------------------------------------------------------------- ```go // Copyright 2025 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 mysqlcommon import ( "database/sql" "encoding/json" "reflect" ) // ConvertToType handles casting mysql returns to the right type // types for mysql driver: https://github.com/go-sql-driver/mysql/blob/v1.9.3/fields.go // all numeric type or unknown type will be return as is. func ConvertToType(t *sql.ColumnType, v any) (any, error) { switch t.ScanType() { case reflect.TypeOf(""), reflect.TypeOf([]byte{}), reflect.TypeOf(sql.NullString{}): // unmarshal JSON data before returning to prevent double marshaling if t.DatabaseTypeName() == "JSON" { // unmarshal JSON data before storing to prevent double marshaling var unmarshaledData any err := json.Unmarshal(v.([]byte), &unmarshaledData) if err != nil { return nil, err } return unmarshaledData, nil } return string(v.([]byte)), nil default: return v, nil } } ``` -------------------------------------------------------------------------------- /.hugo/layouts/shortcodes/regionInclude.html: -------------------------------------------------------------------------------- ```html {{/* snippet.html Usage: {{< regionInclude "filename.md" "region_name" >}} {{< regionInclude "filename.python" "region_name" "python" >}} */}} {{ $file := .Get 0 }} {{ $region := .Get 1 }} {{ $lang := .Get 2 | default "text" }} {{ $path := printf "%s%s" .Page.File.Dir $file }} {{ if or (not $file) (eq $file "") }} {{ errorf "The file parameter (first argument) is required and must be non-empty in %s" .Page.File.Path }} {{ end }} {{ if or (not $region) (eq $region "") }} {{ errorf "The region parameter (second argument) is required and must be non-empty in %s" .Page.File.Path }} {{ end }} {{ if not (fileExists $path) }} {{ errorf "File %q not found (referenced in %s)" $path .Page.File.Path }} {{ end }} {{ $content := readFile $path }} {{ $start_tag := printf "[START %s]" $region }} {{ $end_tag := printf "[END %s]" $region }} {{ $snippet := "" }} {{ $in_snippet := false }} {{ range split $content "\n" }} {{ if $in_snippet }} {{ if in . $end_tag }} {{ $in_snippet = false }} {{ else }} {{ $snippet = printf "%s%s\n" $snippet . }} {{ end }} {{ else if in . $start_tag }} {{ $in_snippet = true }} {{ end }} {{ end }} {{ if eq (trim $snippet "") "" }} {{ errorf "Region %q not found or empty in file %s (referenced in %s)" $region $file .Page.File.Path }} {{ end }} {{ if eq $lang "text" }} {{ $snippet | markdownify }} {{ else }} {{ highlight (trim $snippet "\n") $lang "" }} {{ end }} ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/cloud-sql-mssql-admin.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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. sources: cloud-sql-admin-source: kind: cloud-sql-admin tools: create_instance: kind: cloud-sql-mssql-create-instance source: cloud-sql-admin-source get_instance: kind: cloud-sql-get-instance source: cloud-sql-admin-source list_instances: kind: cloud-sql-list-instances source: cloud-sql-admin-source create_database: kind: cloud-sql-create-database source: cloud-sql-admin-source list_databases: kind: cloud-sql-list-databases source: cloud-sql-admin-source create_user: kind: cloud-sql-create-users source: cloud-sql-admin-source wait_for_operation: kind: cloud-sql-wait-for-operation source: cloud-sql-admin-source toolsets: cloud_sql_mssql_admin_tools: - create_instance - get_instance - list_instances - create_database - list_databases - create_user - wait_for_operation ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/cloud-sql-mysql-admin.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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. sources: cloud-sql-admin-source: kind: cloud-sql-admin tools: create_instance: kind: cloud-sql-mysql-create-instance source: cloud-sql-admin-source get_instance: kind: cloud-sql-get-instance source: cloud-sql-admin-source list_instances: kind: cloud-sql-list-instances source: cloud-sql-admin-source create_database: kind: cloud-sql-create-database source: cloud-sql-admin-source list_databases: kind: cloud-sql-list-databases source: cloud-sql-admin-source create_user: kind: cloud-sql-create-users source: cloud-sql-admin-source wait_for_operation: kind: cloud-sql-wait-for-operation source: cloud-sql-admin-source toolsets: cloud_sql_mysql_admin_tools: - create_instance - get_instance - list_instances - create_database - list_databases - create_user - wait_for_operation ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/cloud-sql-postgres-admin.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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. sources: cloud-sql-admin-source: kind: cloud-sql-admin tools: create_instance: kind: cloud-sql-postgres-create-instance source: cloud-sql-admin-source get_instance: kind: cloud-sql-get-instance source: cloud-sql-admin-source list_instances: kind: cloud-sql-list-instances source: cloud-sql-admin-source create_database: kind: cloud-sql-create-database source: cloud-sql-admin-source list_databases: kind: cloud-sql-list-databases source: cloud-sql-admin-source create_user: kind: cloud-sql-create-users source: cloud-sql-admin-source wait_for_operation: kind: cloud-sql-wait-for-operation source: cloud-sql-admin-source toolsets: cloud_sql_postgres_admin_tools: - create_instance - get_instance - list_instances - create_database - list_databases - create_user - wait_for_operation ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/looker/looker-get-explores.md: -------------------------------------------------------------------------------- ```markdown --- title: "looker-get-explores" type: docs weight: 1 description: > A "looker-get-explores" tool returns all explores for the given model from the source. aliases: - /resources/tools/looker-get-explores --- ## About A `looker-get-explores` tool returns all explores for a given model from the source. It's compatible with the following sources: - [looker](../../sources/looker.md) `looker-get-explores` accepts one parameter, the `model` id. The return type is an array of maps, each map is formatted like: ```json { "name": "explore name", "description": "explore description", "label": "explore label", "group_label": "group label" } ``` ## Example ```yaml tools: get_explores: kind: looker-get-explores source: looker-source description: | The get_explores tool retrieves the list of explores defined in a LookML model in the Looker system. It takes one parameter, the model_name looked up from get_models. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------:|:------------:|----------------------------------------------------| | kind | string | true | Must be "looker-get-explores". | | source | string | true | Name of the source the SQL should execute on. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/mssql/mssql-execute-sql.md: -------------------------------------------------------------------------------- ```markdown --- title: "mssql-execute-sql" type: docs weight: 1 description: > A "mssql-execute-sql" tool executes a SQL statement against a SQL Server database. aliases: - /resources/tools/mssql-execute-sql --- ## About A `mssql-execute-sql` tool executes a SQL statement against a SQL Server database. It's compatible with any of the following sources: - [cloud-sql-mssql](../../sources/cloud-sql-mssql.md) - [mssql](../../sources/mssql.md) `mssql-execute-sql` takes one input parameter `sql` and run the sql statement against the `source`. > **Note:** This tool is intended for developer assistant workflows with > human-in-the-loop and shouldn't be used for production agents. ## Example ```yaml tools: execute_sql_tool: kind: mssql-execute-sql source: my-mssql-instance description: Use this tool to execute sql statement. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:------------------------------------------:|:------------:|----------------------------------------------------| | kind | string | true | Must be "mssql-execute-sql". | | source | string | true | Name of the source the SQL should execute on. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /.github/sync-repo-settings.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2024 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. # Synchronize repository settings from a centralized config # https://github.com/googleapis/repo-automation-bots/tree/main/packages/sync-repo-settings # Install: https://github.com/apps/sync-repo-settings # Disable merge commits rebaseMergeAllowed: true squashMergeAllowed: true mergeCommitAllowed: false # Enable branch protection branchProtectionRules: - pattern: main isAdminEnforced: true requiredStatusCheckContexts: - "cla/google" - "lint" - "conventionalcommits.org" - "header-check" # - Add required status checks like presubmit tests - "unit tests (ubuntu-latest)" - "unit tests (windows-latest)" - "unit tests (macos-latest)" - "integration-test-pr (toolbox-testing-438616)" requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true requiresStrictStatusChecks: true # Set team access permissionRules: - team: senseai-eco permission: admin ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/postgres/postgres-list-installed-extensions.md: -------------------------------------------------------------------------------- ```markdown --- title: "postgres-list-installed-extensions" type: docs weight: 1 description: > The "postgres-list-installed-extensions" tool retrieves all PostgreSQL extensions installed on a Postgres database. aliases: - /resources/tools/postgres-list-installed-extensions --- ## About The `postgres-list-installed-extensions` tool retrieves all PostgreSQL extensions installed on a Postgres database. It's compatible with any of the following sources: - [alloydb-postgres](../../sources/alloydb-pg.md) - [cloud-sql-postgres](../../sources/cloud-sql-pg.md) - [postgres](../../sources/postgres.md) `postgres-list-installed-extensions` lists all installed PostgreSQL extensions (extension name, version, schema, owner, description) as JSON. The does not support any input parameter. ## Example ```yaml tools: list_installed_extensions: kind: postgres-list-installed-extensions source: postgres-source description: List all installed PostgreSQL extensions with their name, version, schema, owner, and description. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------:|:------------:|----------------------------------------------------| | kind | string | true | Must be "postgres-list-active-queries". | | source | string | true | Name of the source the SQL should execute on. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/looker/looker-get-models.md: -------------------------------------------------------------------------------- ```markdown --- title: "looker-get-models" type: docs weight: 1 description: > A "looker-get-models" tool returns all the models in the source. aliases: - /resources/tools/looker-get-models --- ## About A `looker-get-models` tool returns all the models in the source. It's compatible with the following sources: - [looker](../../sources/looker.md) `looker-get-models` accepts no parameters. ## Example ```yaml tools: get_models: kind: looker-get-models source: looker-source description: | The get_models tool retrieves the list of LookML models in the Looker system. It takes no parameters. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:------------------------------------------:|:------------:|--------------------------------------------------------------------------------------------------| | kind | string | true | Must be "looker-get-models". | | source | string | true | Name of the source the SQL should execute on. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/alloydb/alloydb-get-cluster.md: -------------------------------------------------------------------------------- ```markdown --- title: alloydb-get-cluster type: docs weight: 1 description: "The \"alloydb-get-cluster\" tool retrieves details for a specific AlloyDB cluster.\n" aliases: [/resources/tools/alloydb-get-cluster] --- ## About The `alloydb-get-cluster` tool retrieves detailed information for a single, specified AlloyDB cluster. It is compatible with [alloydb-admin](../../sources/alloydb-admin.md) source. | Parameter | Type | Description | Required | | :--------- | :----- | :------------------------------------------------- | :------- | | `project` | string | The GCP project ID to get cluster for. | Yes | | `location` | string | The location of the cluster (e.g., 'us-central1'). | Yes | | `cluster` | string | The ID of the cluster to retrieve. | Yes | ## Example ```yaml tools: get_specific_cluster: kind: alloydb-get-cluster source: my-alloydb-admin-source description: Use this tool to retrieve details for a specific AlloyDB cluster. ``` ## Reference | **field** | **type** | **required** | **description** | | ----------- | :------: | :----------: | ---------------------------------------------------- | | kind | string | true | Must be alloydb-get-cluster. | | source | string | true | The name of an `alloydb-admin` source. | | description | string | false | Description of the tool that is passed to the agent. | ``` -------------------------------------------------------------------------------- /internal/tools/http_method.go: -------------------------------------------------------------------------------- ```go // Copyright 2025 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 tools import ( "context" "fmt" "net/http" "strings" ) // HTTPMethod is a string of a valid HTTP method (e.g "GET") type HTTPMethod string // isValidHTTPMethod checks if the input string matches one of the method constants defined in the net/http package func isValidHTTPMethod(method string) bool { switch method { case http.MethodGet, http.MethodPost, http.MethodPut, http.MethodDelete, http.MethodPatch, http.MethodHead, http.MethodOptions, http.MethodTrace, http.MethodConnect: return true } return false } func (i *HTTPMethod) UnmarshalYAML(ctx context.Context, unmarshal func(interface{}) error) error { var httpMethod string if err := unmarshal(&httpMethod); err != nil { return fmt.Errorf(`error unmarshalling HTTP method: %s`, err) } httpMethod = strings.ToUpper(httpMethod) if !isValidHTTPMethod(httpMethod) { return fmt.Errorf(`%s is not a valid http method`, httpMethod) } *i = HTTPMethod(httpMethod) return nil } ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/alloydb/alloydb-list-users.md: -------------------------------------------------------------------------------- ```markdown --- title: alloydb-list-users type: docs weight: 1 description: "The \"alloydb-list-users\" tool lists all database users within an AlloyDB cluster.\n" aliases: [/resources/tools/alloydb-list-users] --- ## About The `alloydb-list-users` tool lists all database users within an AlloyDB cluster. It is compatible with [alloydb-admin](../../sources/alloydb-admin.md) source. The tool takes the following input parameters: | Parameter | Type | Description | Required | | :--------- | :----- | :------------------------------------------------- | :------- | | `project` | string | The GCP project ID to list users for. | Yes | | `cluster` | string | The ID of the cluster to list users from. | Yes | | `location` | string | The location of the cluster (e.g., 'us-central1'). | Yes | ## Example ```yaml tools: list_users: kind: alloydb-list-users source: alloydb-admin-source description: Use this tool to list all database users within an AlloyDB cluster ``` ## Reference | **field** | **type** | **required** | **description** | | ----------- | :------: | :----------: | ---------------------------------------------------- | | kind | string | true | Must be alloydb-list-users. | | source | string | true | The name of an `alloydb-admin` source. | | description | string | false | Description of the tool that is passed to the agent. | ``` -------------------------------------------------------------------------------- /.ci/quickstart_test/setup_hotels_sample.sql: -------------------------------------------------------------------------------- ```sql -- Copyright 2025 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. TRUNCATE TABLE $TABLE_NAME; INSERT INTO $TABLE_NAME (id, name, location, price_tier, checkin_date, checkout_date, booked) VALUES (1, 'Hilton Basel', 'Basel', 'Luxury', '2024-04-22', '2024-04-20', B'0'), (2, 'Marriott Zurich', 'Zurich', 'Upscale', '2024-04-14', '2024-04-21', B'0'), (3, 'Hyatt Regency Basel', 'Basel', 'Upper Upscale', '2024-04-02', '2024-04-20', B'0'), (4, 'Radisson Blu Lucerne', 'Lucerne', 'Midscale', '2024-04-24', '2024-04-05', B'0'), (5, 'Best Western Bern', 'Bern', 'Upper Midscale', '2024-04-23', '2024-04-01', B'0'), (6, 'InterContinental Geneva', 'Geneva', 'Luxury', '2024-04-23', '2024-04-28', B'0'), (7, 'Sheraton Zurich', 'Zurich', 'Upper Upscale', '2024-04-27', '2024-04-02', B'0'), (8, 'Holiday Inn Basel', 'Basel', 'Upper Midscale', '2024-04-24', '2024-04-09', B'0'), (9, 'Courtyard Zurich', 'Zurich', 'Upscale', '2024-04-03', '2024-04-13', B'0'), (10, 'Comfort Inn Bern', 'Bern', 'Midscale', '2024-04-04', '2024-04-16', B'0'); ``` -------------------------------------------------------------------------------- /.hugo/layouts/shortcodes/ipynb.html: -------------------------------------------------------------------------------- ```html {{ $notebookFile := .Get 0 }} {{ with .Page.Resources.Get $notebookFile }} {{ $content := .Content | transform.Unmarshal }} {{ range $content.cells }} {{ if eq .cell_type "markdown" }} <div class="notebook-markdown"> {{ $markdown := "" }} {{ range .source }}{{ $markdown = print $markdown . }}{{ end }} {{ $markdown | markdownify }} </div> {{ end }} {{ if eq .cell_type "code" }} <div class="notebook-code"> {{ $code := "" }} {{ range .source }}{{ $code = print $code . }}{{ end }} {{ highlight $code "python" "" }} {{ range .outputs }} <div class="notebook-output"> {{ with .text }} <pre class="notebook-stream"><code>{{- range . }}{{ . }}{{ end -}}</code></pre> {{ end }} {{ with .data }} {{ with index . "image/png" }} <img src="data:image/png;base64,{{ . }}" alt="Notebook output image"> {{ end }} {{ with index . "image/jpeg" }} <img src="data:image/jpeg;base64,{{ . }}" alt="Notebook output image"> {{ end }} {{ with index . "text/html" }} {{ $html := "" }} {{ range . }}{{ $html = print $html . }}{{ end }} {{ $html | safeHTML }} {{ end }} {{ end }} </div> {{ end }} </div> {{ end }} {{ end }} {{ else }} <p style="color: red;">Error: Notebook '{{ $notebookFile }}' not found in page resources.</p> {{ end }} ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudsql/cloudsqlcreatedatabase.md: -------------------------------------------------------------------------------- ```markdown --- title: cloud-sql-create-database type: docs weight: 10 description: > Create a new database in a Cloud SQL instance. --- The `cloud-sql-create-database` tool creates a new database in a specified Cloud SQL instance. {{< notice info >}} This tool uses a `source` of kind `cloud-sql-admin`. {{< /notice >}} ## Example ```yaml tools: create-cloud-sql-database: kind: cloud-sql-create-database source: my-cloud-sql-admin-source description: "Creates a new database in a Cloud SQL instance." ``` ## Reference | **field** | **type** | **required** | **description** | | ----------- | :------: | :----------: | ------------------------------------------------ | | kind | string | true | Must be "cloud-sql-create-database". | | source | string | true | The name of the `cloud-sql-admin` source to use. | | description | string | false | A description of the tool. | ## Input Parameters | **parameter** | **type** | **required** | **description** | | ------------- | :------: | :----------: | ------------------------------------------------------------------ | | project | string | true | The project ID. | | instance | string | true | The ID of the instance where the database will be created. | | name | string | true | The name for the new database. Must be unique within the instance. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/looker/looker-conversational-analytics.md: -------------------------------------------------------------------------------- ```markdown --- title: "looker-conversational-analytics" type: docs weight: 1 description: > The "looker-conversational-analytics" tool will use the Conversational Analaytics API to analyze data from Looker aliases: - /resources/tools/looker-conversational-analytics --- ## About A `looker-conversational-analytics` tool allows you to ask questions about your Looker data. It's compatible with the following sources: - [looker](../../sources/looker.md) `looker-conversational-analytics` accepts two parameters: 1. `user_query_with_context`: The question asked of the Conversational Analytics system. 2. `explore_references`: A list of one to five explores that can be queried to answer the question. The form of the entry is `[{"model": "model name", "explore": "explore name"}, ...]` ## Example ```yaml tools: ask_data_insights: kind: looker-conversational-analytics source: looker-source description: | Use this tool to perform data analysis, get insights, or answer complex questions about the contents of specific Looker explores. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------:|:------------:|----------------------------------------------------| | kind | string | true | Must be "lookerca-conversational-analytics". | | source | string | true | Name of the source the SQL should execute on. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudsql/cloudsqllistinstances.md: -------------------------------------------------------------------------------- ```markdown --- title: Cloud SQL List Instances type: docs weight: 1 description: "List Cloud SQL instances in a project.\n" --- The `cloud-sql-list-instances` tool lists all Cloud SQL instances in a specified Google Cloud project. {{< notice info >}} This tool uses the `cloud-sql-admin` source, which automatically handles authentication on behalf of the user. {{< /notice >}} ## Configuration Here is an example of how to configure the `cloud-sql-list-instances` tool in your `tools.yaml` file: ```yaml sources: my-cloud-sql-admin-source: kind: cloud-sql-admin tools: list_my_instances: kind: cloud-sql-list-instances source: my-cloud-sql-admin-source description: Use this tool to list all Cloud SQL instances in a project. ``` ## Parameters The `cloud-sql-list-instances` tool has one required parameter: | **field** | **type** | **required** | **description** | | --------- | :------: | :----------: | ---------------------------- | | project | string | true | The Google Cloud project ID. | ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------:|:------------:|----------------------------------------------------------------| | kind | string | true | Must be "cloud-sql-list-instances". | | description | string | false | Description of the tool that is passed to the agent. | | source | string | true | The name of the `cloud-sql-admin` source to use for this tool. | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/spanner.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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. sources: spanner-source: kind: spanner project: ${SPANNER_PROJECT} instance: ${SPANNER_INSTANCE} database: ${SPANNER_DATABASE} dialect: ${SPANNER_DIALECT:googlesql} tools: execute_sql: kind: spanner-execute-sql source: spanner-source description: Use this tool to execute DML SQL. Please use the ${SPANNER_DIALECT:googlesql} interface for Spanner. execute_sql_dql: kind: spanner-execute-sql source: spanner-source description: Use this tool to execute DQL SQL. Please use the ${SPANNER_DIALECT:googlesql} interface for Spanner. readOnly: true list_tables: kind: spanner-list-tables source: spanner-source description: "Lists detailed schema information (object type, columns, constraints, indexes) as JSON for user-created tables (ordinary or partitioned). Filters by a comma-separated list of names. If names are omitted, lists all tables in user schemas." toolsets: spanner-database-tools: - execute_sql - execute_sql_dql - list_tables ``` -------------------------------------------------------------------------------- /cmd/options_test.go: -------------------------------------------------------------------------------- ```go // Copyright 2024 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 cmd import ( "errors" "io" "testing" "github.com/spf13/cobra" ) func TestCommandOptions(t *testing.T) { w := io.Discard tcs := []struct { desc string isValid func(*Command) error option Option }{ { desc: "with logger", isValid: func(c *Command) error { if c.outStream != w || c.errStream != w { return errors.New("loggers do not match") } return nil }, option: WithStreams(w, w), }, } for _, tc := range tcs { t.Run(tc.desc, func(t *testing.T) { got, err := invokeProxyWithOption(tc.option) if err != nil { t.Fatal(err) } if err := tc.isValid(got); err != nil { t.Errorf("option did not initialize command correctly: %v", err) } }) } } func invokeProxyWithOption(o Option) (*Command, error) { c := NewCommand(o) // Keep the test output quiet c.SilenceUsage = true c.SilenceErrors = true // Disable execute behavior c.RunE = func(*cobra.Command, []string) error { return nil } err := c.Execute() return c, err } ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/alloydb/alloydb-get-user.md: -------------------------------------------------------------------------------- ```markdown --- title: alloydb-get-user type: docs weight: 1 description: "The \"alloydb-get-user\" tool retrieves details for a specific AlloyDB user.\n" aliases: [/resources/tools/alloydb-get-user] --- ## About The `alloydb-get-user` tool retrieves detailed information for a single, specified AlloyDB user. It is compatible with [alloydb-admin](../../sources/alloydb-admin.md) source. | Parameter | Type | Description | Required | | :--------- | :----- | :------------------------------------------------- | :------- | | `project` | string | The GCP project ID to get user for. | Yes | | `location` | string | The location of the cluster (e.g., 'us-central1'). | Yes | | `cluster` | string | The ID of the cluster to retrieve the user from. | Yes | | `user` | string | The ID of the user to retrieve. | Yes | ## Example ```yaml tools: get_specific_user: kind: alloydb-get-user source: my-alloydb-admin-source description: Use this tool to retrieve details for a specific AlloyDB user. ``` ## Reference | **field** | **type** | **required** | **description** | | ----------- | :------: | :----------: | ---------------------------------------------------- | | kind | string | true | Must be alloydb-get-user. | | source | string | true | The name of an `alloydb-admin` source. | | description | string | false | Description of the tool that is passed to the agent. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/looker/looker-run-look.md: -------------------------------------------------------------------------------- ```markdown --- title: "looker-run-look" type: docs weight: 1 description: > "looker-run-look" runs the query associated with a saved Look. aliases: - /resources/tools/looker-run-look --- ## About The `looker-run-look` tool runs the query associated with a saved Look. It's compatible with the following sources: - [looker](../../sources/looker.md) `looker-run-look` takes one parameter, the `look_id`. ## Example ```yaml tools: run_look: kind: looker-run-look source: looker-source description: | run_look Tool This tool runs the query associated with a look and returns the data in a JSON structure. It accepts the look_id as the parameter. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:------------------------------------------:|:------------:|--------------------------------------------------------------------------------------------------| | kind | string | true | Must be "looker-run-look" | | source | string | true | Name of the source the SQL should execute on. | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/cloud-sql-mssql.yaml: -------------------------------------------------------------------------------- ```yaml # Copyright 2025 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. sources: cloudsql-mssql-source: kind: cloud-sql-mssql project: ${CLOUD_SQL_MSSQL_PROJECT} region: ${CLOUD_SQL_MSSQL_REGION} instance: ${CLOUD_SQL_MSSQL_INSTANCE} database: ${CLOUD_SQL_MSSQL_DATABASE} ipAddress: ${CLOUD_SQL_MSSQL_IP_ADDRESS} user: ${CLOUD_SQL_MSSQL_USER} password: ${CLOUD_SQL_MSSQL_PASSWORD} ipType: ${CLOUD_SQL_MSSQL_IP_TYPE:public} tools: execute_sql: kind: mssql-execute-sql source: cloudsql-mssql-source description: Use this tool to execute SQL. list_tables: kind: mssql-list-tables source: cloudsql-mssql-source description: "Lists detailed schema information (object type, columns, constraints, indexes, triggers, comment) as JSON for user-created tables (ordinary or partitioned). Filters by a comma-separated list of names. If names are omitted, lists all tables in user schemas." toolsets: cloud_sql_mssql_database_tools: - execute_sql - list_tables ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudsql/cloudsqllistdatabases.md: -------------------------------------------------------------------------------- ```markdown --- title: cloud-sql-list-databases type: docs weight: 1 description: List Cloud SQL databases in an instance. --- The `cloud-sql-list-databases` tool lists all Cloud SQL databases in a specified Google Cloud project and instance. {{< notice info >}} This tool uses the `cloud-sql-admin` source. {{< /notice >}} ## Configuration Here is an example of how to configure the `cloud-sql-list-databases` tool in your `tools.yaml` file: ```yaml sources: my-cloud-sql-admin-source: kind: cloud-sql-admin tools: list_my_databases: kind: cloud-sql-list-databases source: my-cloud-sql-admin-source description: Use this tool to list all Cloud SQL databases in an instance. ``` ## Parameters The `cloud-sql-list-databases` tool has two required parameters: | **field** | **type** | **required** | **description** | | --------- | :------: | :----------: | ---------------------------- | | project | string | true | The Google Cloud project ID. | | instance | string | true | The Cloud SQL instance ID. | ## Reference | **field** | **type** | **required** | **description** | | ----------- | :------: | :----------: | -------------------------------------------------------------- | | kind | string | true | Must be "cloud-sql-list-databases". | | source | string | true | The name of the `cloud-sql-admin` source to use for this tool. | | description | string | false | Description of the tool that is passed to the agent. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/spanner/spanner-execute-sql.md: -------------------------------------------------------------------------------- ```markdown --- title: "spanner-execute-sql" type: docs weight: 1 description: > A "spanner-execute-sql" tool executes a SQL statement against a Spanner database. aliases: - /resources/tools/spanner-execute-sql --- ## About A `spanner-execute-sql` tool executes a SQL statement against a Spanner database. It's compatible with any of the following sources: - [spanner](../../sources/spanner.md) `spanner-execute-sql` takes one input parameter `sql` and run the sql statement against the `source`. > **Note:** This tool is intended for developer assistant workflows with > human-in-the-loop and shouldn't be used for production agents. ## Example ```yaml tools: execute_sql_tool: kind: spanner-execute-sql source: my-spanner-instance description: Use this tool to execute sql statement. ``` ## Reference | **field** | **type** | **required** | **description** | |-------------|:--------:|:------------:|------------------------------------------------------------------------------------------| | kind | string | true | Must be "spanner-execute-sql". | | source | string | true | Name of the source the SQL should execute on. | | description | string | true | Description of the tool that is passed to the LLM. | | readOnly | bool | false | When set to `true`, the `statement` is run as a read-only transaction. Default: `false`. | ```