This is page 1 of 45. Use http://codebase.md/googleapis/genai-toolbox?lines=true&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: -------------------------------------------------------------------------------- ``` 1 | [submodule "docs2/themes/godocs"] 2 | path = docs2/themes/godocs 3 | url = https://github.com/themefisher/godocs.git 4 | ``` -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- ``` 1 | # direnv 2 | .envrc 3 | 4 | # vscode 5 | .vscode/ 6 | 7 | # idea 8 | .idea/ 9 | 10 | # npm 11 | node_modules 12 | 13 | # hugo 14 | .hugo/public/ 15 | .hugo/resources/_gen 16 | .hugo_build.lock 17 | 18 | # coverage 19 | .coverage 20 | 21 | # executable 22 | genai-toolbox 23 | toolbox 24 | ``` -------------------------------------------------------------------------------- /.golangci.yaml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2024 Google LLC. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | version: "2" 16 | linters: 17 | enable: 18 | - errcheck 19 | - govet 20 | - ineffassign 21 | - staticcheck 22 | - unused 23 | exclusions: 24 | presets: 25 | - std-error-handling 26 | issues: 27 | fix: true 28 | formatters: 29 | enable: 30 | - goimports 31 | settings: 32 | gofmt: 33 | rewrite-rules: 34 | - pattern: interface{} 35 | replacement: any 36 | - pattern: a[b:len(a)] 37 | replacement: a[b:] 38 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- ```markdown 1 |  2 | 3 | # MCP Toolbox for Databases 4 | 5 | [](https://googleapis.github.io/genai-toolbox/) 6 | [](https://discord.gg/Dmm69peqjh) 7 | [](https://medium.com/@mcp_toolbox) 8 | [](https://goreportcard.com/report/github.com/googleapis/genai-toolbox) 9 | 10 | > [!NOTE] 11 | > MCP Toolbox for Databases is currently in beta, and may see breaking 12 | > changes until the first stable release (v1.0). 13 | 14 | MCP Toolbox for Databases is an open source MCP server for databases. It enables 15 | you to develop tools easier, faster, and more securely by handling the complexities 16 | such as connection pooling, authentication, and more. 17 | 18 | This README provides a brief overview. For comprehensive details, see the [full 19 | documentation](https://googleapis.github.io/genai-toolbox/). 20 | 21 | > [!NOTE] 22 | > This solution was originally named “Gen AI Toolbox for Databases” as 23 | > its initial development predated MCP, but was renamed to align with recently 24 | > added MCP compatibility. 25 | 26 | <!-- TOC ignore:true --> 27 | ## Table of Contents 28 | 29 | <!-- TOC --> 30 | 31 | - [Why Toolbox?](#why-toolbox) 32 | - [General Architecture](#general-architecture) 33 | - [Getting Started](#getting-started) 34 | - [Installing the server](#installing-the-server) 35 | - [Running the server](#running-the-server) 36 | - [Integrating your application](#integrating-your-application) 37 | - [Configuration](#configuration) 38 | - [Sources](#sources) 39 | - [Tools](#tools) 40 | - [Toolsets](#toolsets) 41 | - [Versioning](#versioning) 42 | - [Pre-1.0.0 Versioning](#pre-100-versioning) 43 | - [Post-1.0.0 Versioning](#post-100-versioning) 44 | - [Contributing](#contributing) 45 | - [Community](#community) 46 | 47 | <!-- /TOC --> 48 | 49 | ## Why Toolbox? 50 | 51 | Toolbox helps you build Gen AI tools that let your agents access data in your 52 | database. Toolbox provides: 53 | 54 | - **Simplified development**: Integrate tools to your agent in less than 10 55 | lines of code, reuse tools between multiple agents or frameworks, and deploy 56 | new versions of tools more easily. 57 | - **Better performance**: Best practices such as connection pooling, 58 | authentication, and more. 59 | - **Enhanced security**: Integrated auth for more secure access to your data 60 | - **End-to-end observability**: Out of the box metrics and tracing with built-in 61 | support for OpenTelemetry. 62 | 63 | **⚡ Supercharge Your Workflow with an AI Database Assistant ⚡** 64 | 65 | Stop context-switching and let your AI assistant become a true co-developer. By 66 | [connecting your IDE to your databases with MCP Toolbox][connect-ide], you can 67 | delegate complex and time-consuming database tasks, allowing you to build faster 68 | and focus on what matters. This isn't just about code completion; it's about 69 | giving your AI the context it needs to handle the entire development lifecycle. 70 | 71 | Here’s how it will save you time: 72 | 73 | - **Query in Plain English**: Interact with your data using natural language 74 | right from your IDE. Ask complex questions like, *"How many orders were 75 | delivered in 2024, and what items were in them?"* without writing any SQL. 76 | - **Automate Database Management**: Simply describe your data needs, and let the 77 | AI assistant manage your database for you. It can handle generating queries, 78 | creating tables, adding indexes, and more. 79 | - **Generate Context-Aware Code**: Empower your AI assistant to generate 80 | application code and tests with a deep understanding of your real-time 81 | database schema. This accelerates the development cycle by ensuring the 82 | generated code is directly usable. 83 | - **Slash Development Overhead**: Radically reduce the time spent on manual 84 | setup and boilerplate. MCP Toolbox helps streamline lengthy database 85 | configurations, repetitive code, and error-prone schema migrations. 86 | 87 | Learn [how to connect your AI tools (IDEs) to Toolbox using MCP][connect-ide]. 88 | 89 | [connect-ide]: https://googleapis.github.io/genai-toolbox/how-to/connect-ide/ 90 | 91 | ## General Architecture 92 | 93 | Toolbox sits between your application's orchestration framework and your 94 | database, providing a control plane that is used to modify, distribute, or 95 | invoke tools. It simplifies the management of your tools by providing you with a 96 | centralized location to store and update tools, allowing you to share tools 97 | between agents and applications and update those tools without necessarily 98 | redeploying your application. 99 | 100 |  101 | 102 | ## Getting Started 103 | 104 | ### Installing the server 105 | 106 | For the latest version, check the [releases page][releases] and use the 107 | following instructions for your OS and CPU architecture. 108 | 109 | [releases]: https://github.com/googleapis/genai-toolbox/releases 110 | 111 | <details open> 112 | <summary>Binary</summary> 113 | 114 | To install Toolbox as a binary: 115 | 116 | <!-- {x-release-please-start-version} --> 117 | > <details> 118 | > <summary>Linux (AMD64)</summary> 119 | > 120 | > To install Toolbox as a binary on Linux (AMD64): 121 | > 122 | > ```sh 123 | > # see releases page for other versions 124 | > export VERSION=0.17.0 125 | > curl -L -o toolbox https://storage.googleapis.com/genai-toolbox/v$VERSION/linux/amd64/toolbox 126 | > chmod +x toolbox 127 | > ``` 128 | > 129 | > </details> 130 | > <details> 131 | > <summary>macOS (Apple Silicon)</summary> 132 | > 133 | > To install Toolbox as a binary on macOS (Apple Silicon): 134 | > 135 | > ```sh 136 | > # see releases page for other versions 137 | > export VERSION=0.17.0 138 | > curl -L -o toolbox https://storage.googleapis.com/genai-toolbox/v$VERSION/darwin/arm64/toolbox 139 | > chmod +x toolbox 140 | > ``` 141 | > 142 | > </details> 143 | > <details> 144 | > <summary>macOS (Intel)</summary> 145 | > 146 | > To install Toolbox as a binary on macOS (Intel): 147 | > 148 | > ```sh 149 | > # see releases page for other versions 150 | > export VERSION=0.17.0 151 | > curl -L -o toolbox https://storage.googleapis.com/genai-toolbox/v$VERSION/darwin/amd64/toolbox 152 | > chmod +x toolbox 153 | > ``` 154 | > 155 | > </details> 156 | > <details> 157 | > <summary>Windows (AMD64)</summary> 158 | > 159 | > To install Toolbox as a binary on Windows (AMD64): 160 | > 161 | > ```powershell 162 | > # see releases page for other versions 163 | > $VERSION = "0.17.0" 164 | > Invoke-WebRequest -Uri "https://storage.googleapis.com/genai-toolbox/v$VERSION/windows/amd64/toolbox.exe" -OutFile "toolbox.exe" 165 | > ``` 166 | > 167 | > </details> 168 | </details> 169 | 170 | <details> 171 | <summary>Container image</summary> 172 | You can also install Toolbox as a container: 173 | 174 | ```sh 175 | # see releases page for other versions 176 | export VERSION=0.17.0 177 | docker pull us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$VERSION 178 | ``` 179 | 180 | </details> 181 | 182 | <details> 183 | <summary>Homebrew</summary> 184 | 185 | To install Toolbox using Homebrew on macOS or Linux: 186 | 187 | ```sh 188 | brew install mcp-toolbox 189 | ``` 190 | 191 | </details> 192 | 193 | <details> 194 | <summary>Compile from source</summary> 195 | 196 | To install from source, ensure you have the latest version of 197 | [Go installed](https://go.dev/doc/install), and then run the following command: 198 | 199 | ```sh 200 | go install github.com/googleapis/[email protected] 201 | ``` 202 | <!-- {x-release-please-end} --> 203 | 204 | </details> 205 | 206 | <details> 207 | <summary>Gemini CLI Extensions</summary> 208 | 209 | To install Gemini CLI Extensions for MCP Toolbox, run the following command: 210 | 211 | ```sh 212 | gemini extensions install https://github.com/gemini-cli-extensions/mcp-toolbox 213 | ``` 214 | 215 | </details> 216 | 217 | ### Running the server 218 | 219 | [Configure](#configuration) a `tools.yaml` to define your tools, and then 220 | execute `toolbox` to start the server: 221 | 222 | <details open> 223 | <summary>Binary</summary> 224 | 225 | To run Toolbox from binary: 226 | 227 | ```sh 228 | ./toolbox --tools-file "tools.yaml" 229 | ``` 230 | 231 | ⓘ **NOTE:** 232 | Toolbox enables dynamic reloading by default. To disable, use the 233 | `--disable-reload` flag. 234 | 235 | </details> 236 | 237 | <details> 238 | 239 | <summary>Container image</summary> 240 | 241 | To run the server after pulling the [container image](#installing-the-server): 242 | 243 | ```sh 244 | export VERSION=0.11.0 # Use the version you pulled 245 | docker run -p 5000:5000 \ 246 | -v $(pwd)/tools.yaml:/app/tools.yaml \ 247 | us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$VERSION \ 248 | --tools-file "/app/tools.yaml" 249 | ``` 250 | 251 | ⓘ **NOTE:** 252 | The `-v` flag mounts your local `tools.yaml` into the container, and `-p` maps 253 | the container's port `5000` to your host's port `5000`. 254 | 255 | </details> 256 | 257 | <details> 258 | 259 | <summary>Source</summary> 260 | 261 | To run the server directly from source, navigate to the project root directory 262 | and run: 263 | 264 | ```sh 265 | go run . 266 | ``` 267 | 268 | ⓘ **NOTE:** 269 | This command runs the project from source, and is more suitable for development 270 | and testing. It does **not** compile a binary into your `$GOPATH`. If you want 271 | to compile a binary instead, refer the [Developer 272 | Documentation](./DEVELOPER.md#building-the-binary). 273 | 274 | </details> 275 | 276 | <details> 277 | 278 | <summary>Homebrew</summary> 279 | 280 | If you installed Toolbox using [Homebrew](https://brew.sh/), the `toolbox` 281 | binary is available in your system path. You can start the server with the same 282 | command: 283 | 284 | ```sh 285 | toolbox --tools-file "tools.yaml" 286 | ``` 287 | 288 | </details> 289 | 290 | <details> 291 | 292 | <summary>Gemini CLI</summary> 293 | 294 | Interact with your custom tools using natural language. Check 295 | [gemini-cli-extensions/mcp-toolbox](https://github.com/gemini-cli-extensions/mcp-toolbox) 296 | for more information. 297 | 298 | </details> 299 | 300 | You can use `toolbox help` for a full list of flags! To stop the server, send a 301 | terminate signal (`ctrl+c` on most platforms). 302 | 303 | For more detailed documentation on deploying to different environments, check 304 | out the resources in the [How-to 305 | section](https://googleapis.github.io/genai-toolbox/how-to/) 306 | 307 | ### Integrating your application 308 | 309 | Once your server is up and running, you can load the tools into your 310 | application. See below the list of Client SDKs for using various frameworks: 311 | 312 | <details open> 313 | <summary>Python (<a href="https://github.com/googleapis/mcp-toolbox-sdk-python">Github</a>)</summary> 314 | <br> 315 | <blockquote> 316 | 317 | <details open> 318 | <summary>Core</summary> 319 | 320 | 1. Install [Toolbox Core SDK][toolbox-core]: 321 | 322 | ```bash 323 | pip install toolbox-core 324 | ``` 325 | 326 | 1. Load tools: 327 | 328 | ```python 329 | from toolbox_core import ToolboxClient 330 | 331 | # update the url to point to your server 332 | async with ToolboxClient("http://127.0.0.1:5000") as client: 333 | 334 | # these tools can be passed to your application! 335 | tools = await client.load_toolset("toolset_name") 336 | ``` 337 | 338 | For more detailed instructions on using the Toolbox Core SDK, see the 339 | [project's README][toolbox-core-readme]. 340 | 341 | [toolbox-core]: https://pypi.org/project/toolbox-core/ 342 | [toolbox-core-readme]: https://github.com/googleapis/mcp-toolbox-sdk-python/tree/main/packages/toolbox-core/README.md 343 | 344 | </details> 345 | <details> 346 | <summary>LangChain / LangGraph</summary> 347 | 348 | 1. Install [Toolbox LangChain SDK][toolbox-langchain]: 349 | 350 | ```bash 351 | pip install toolbox-langchain 352 | ``` 353 | 354 | 1. Load tools: 355 | 356 | ```python 357 | from toolbox_langchain import ToolboxClient 358 | 359 | # update the url to point to your server 360 | async with ToolboxClient("http://127.0.0.1:5000") as client: 361 | 362 | # these tools can be passed to your application! 363 | tools = client.load_toolset() 364 | ``` 365 | 366 | For more detailed instructions on using the Toolbox LangChain SDK, see the 367 | [project's README][toolbox-langchain-readme]. 368 | 369 | [toolbox-langchain]: https://pypi.org/project/toolbox-langchain/ 370 | [toolbox-langchain-readme]: https://github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-langchain/README.md 371 | 372 | </details> 373 | <details> 374 | <summary>LlamaIndex</summary> 375 | 376 | 1. Install [Toolbox Llamaindex SDK][toolbox-llamaindex]: 377 | 378 | ```bash 379 | pip install toolbox-llamaindex 380 | ``` 381 | 382 | 1. Load tools: 383 | 384 | ```python 385 | from toolbox_llamaindex import ToolboxClient 386 | 387 | # update the url to point to your server 388 | async with ToolboxClient("http://127.0.0.1:5000") as client: 389 | 390 | # these tools can be passed to your application! 391 | tools = client.load_toolset() 392 | ``` 393 | 394 | For more detailed instructions on using the Toolbox Llamaindex SDK, see the 395 | [project's README][toolbox-llamaindex-readme]. 396 | 397 | [toolbox-llamaindex]: https://pypi.org/project/toolbox-llamaindex/ 398 | [toolbox-llamaindex-readme]: https://github.com/googleapis/genai-toolbox-llamaindex-python/blob/main/README.md 399 | 400 | </details> 401 | </details> 402 | </blockquote> 403 | <details> 404 | <summary>Javascript/Typescript (<a href="https://github.com/googleapis/mcp-toolbox-sdk-js">Github</a>)</summary> 405 | <br> 406 | <blockquote> 407 | 408 | <details open> 409 | <summary>Core</summary> 410 | 411 | 1. Install [Toolbox Core SDK][toolbox-core-js]: 412 | 413 | ```bash 414 | npm install @toolbox-sdk/core 415 | ``` 416 | 417 | 1. Load tools: 418 | 419 | ```javascript 420 | import { ToolboxClient } from '@toolbox-sdk/core'; 421 | 422 | // update the url to point to your server 423 | const URL = 'http://127.0.0.1:5000'; 424 | let client = new ToolboxClient(URL); 425 | 426 | // these tools can be passed to your application! 427 | const tools = await client.loadToolset('toolsetName'); 428 | ``` 429 | 430 | For more detailed instructions on using the Toolbox Core SDK, see the 431 | [project's README][toolbox-core-js-readme]. 432 | 433 | [toolbox-core-js]: https://www.npmjs.com/package/@toolbox-sdk/core 434 | [toolbox-core-js-readme]: https://github.com/googleapis/mcp-toolbox-sdk-js/blob/main/packages/toolbox-core/README.md 435 | 436 | </details> 437 | <details> 438 | <summary>LangChain / LangGraph</summary> 439 | 440 | 1. Install [Toolbox Core SDK][toolbox-core-js]: 441 | 442 | ```bash 443 | npm install @toolbox-sdk/core 444 | ``` 445 | 446 | 2. Load tools: 447 | 448 | ```javascript 449 | import { ToolboxClient } from '@toolbox-sdk/core'; 450 | 451 | // update the url to point to your server 452 | const URL = 'http://127.0.0.1:5000'; 453 | let client = new ToolboxClient(URL); 454 | 455 | // these tools can be passed to your application! 456 | const toolboxTools = await client.loadToolset('toolsetName'); 457 | 458 | // Define the basics of the tool: name, description, schema and core logic 459 | const getTool = (toolboxTool) => tool(currTool, { 460 | name: toolboxTool.getName(), 461 | description: toolboxTool.getDescription(), 462 | schema: toolboxTool.getParamSchema() 463 | }); 464 | 465 | // Use these tools in your Langchain/Langraph applications 466 | const tools = toolboxTools.map(getTool); 467 | ``` 468 | 469 | </details> 470 | <details> 471 | <summary>Genkit</summary> 472 | 473 | 1. Install [Toolbox Core SDK][toolbox-core-js]: 474 | 475 | ```bash 476 | npm install @toolbox-sdk/core 477 | ``` 478 | 479 | 2. Load tools: 480 | 481 | ```javascript 482 | import { ToolboxClient } from '@toolbox-sdk/core'; 483 | import { genkit } from 'genkit'; 484 | 485 | // Initialise genkit 486 | const ai = genkit({ 487 | plugins: [ 488 | googleAI({ 489 | apiKey: process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY 490 | }) 491 | ], 492 | model: googleAI.model('gemini-2.0-flash'), 493 | }); 494 | 495 | // update the url to point to your server 496 | const URL = 'http://127.0.0.1:5000'; 497 | let client = new ToolboxClient(URL); 498 | 499 | // these tools can be passed to your application! 500 | const toolboxTools = await client.loadToolset('toolsetName'); 501 | 502 | // Define the basics of the tool: name, description, schema and core logic 503 | const getTool = (toolboxTool) => ai.defineTool({ 504 | name: toolboxTool.getName(), 505 | description: toolboxTool.getDescription(), 506 | schema: toolboxTool.getParamSchema() 507 | }, toolboxTool) 508 | 509 | // Use these tools in your Genkit applications 510 | const tools = toolboxTools.map(getTool); 511 | ``` 512 | 513 | </details> 514 | </details> 515 | </blockquote> 516 | <details> 517 | <summary>Go (<a href="https://github.com/googleapis/mcp-toolbox-sdk-go">Github</a>)</summary> 518 | <br> 519 | <blockquote> 520 | 521 | <details open> 522 | <summary>Core</summary> 523 | 524 | 1. Install [Toolbox Go SDK][toolbox-go]: 525 | 526 | ```bash 527 | go get github.com/googleapis/mcp-toolbox-sdk-go 528 | ``` 529 | 530 | 1. Load tools: 531 | 532 | ```go 533 | package main 534 | 535 | import ( 536 | "github.com/googleapis/mcp-toolbox-sdk-go/core" 537 | "context" 538 | ) 539 | 540 | func main() { 541 | // Make sure to add the error checks 542 | // update the url to point to your server 543 | URL := "http://127.0.0.1:5000"; 544 | ctx := context.Background() 545 | 546 | client, err := core.NewToolboxClient(URL) 547 | 548 | // Framework agnostic tools 549 | tools, err := client.LoadToolset("toolsetName", ctx) 550 | } 551 | ``` 552 | 553 | For more detailed instructions on using the Toolbox Go SDK, see the 554 | [project's README][toolbox-core-go-readme]. 555 | 556 | [toolbox-go]: https://pkg.go.dev/github.com/googleapis/mcp-toolbox-sdk-go/core 557 | [toolbox-core-go-readme]: https://github.com/googleapis/mcp-toolbox-sdk-go/blob/main/core/README.md 558 | 559 | </details> 560 | <details> 561 | <summary>LangChain Go</summary> 562 | 563 | 1. Install [Toolbox Go SDK][toolbox-go]: 564 | 565 | ```bash 566 | go get github.com/googleapis/mcp-toolbox-sdk-go 567 | ``` 568 | 569 | 2. Load tools: 570 | 571 | ```go 572 | package main 573 | 574 | import ( 575 | "context" 576 | "encoding/json" 577 | 578 | "github.com/googleapis/mcp-toolbox-sdk-go/core" 579 | "github.com/tmc/langchaingo/llms" 580 | ) 581 | 582 | func main() { 583 | // Make sure to add the error checks 584 | // update the url to point to your server 585 | URL := "http://127.0.0.1:5000" 586 | ctx := context.Background() 587 | 588 | client, err := core.NewToolboxClient(URL) 589 | 590 | // Framework agnostic tool 591 | tool, err := client.LoadTool("toolName", ctx) 592 | 593 | // Fetch the tool's input schema 594 | inputschema, err := tool.InputSchema() 595 | 596 | var paramsSchema map[string]any 597 | _ = json.Unmarshal(inputschema, ¶msSchema) 598 | 599 | // Use this tool with LangChainGo 600 | langChainTool := llms.Tool{ 601 | Type: "function", 602 | Function: &llms.FunctionDefinition{ 603 | Name: tool.Name(), 604 | Description: tool.Description(), 605 | Parameters: paramsSchema, 606 | }, 607 | } 608 | } 609 | 610 | ``` 611 | 612 | </details> 613 | <details> 614 | <summary>Genkit</summary> 615 | 616 | 1. Install [Toolbox Go SDK][toolbox-go]: 617 | 618 | ```bash 619 | go get github.com/googleapis/mcp-toolbox-sdk-go 620 | ``` 621 | 622 | 2. Load tools: 623 | 624 | ```go 625 | package main 626 | import ( 627 | "context" 628 | "log" 629 | 630 | "github.com/firebase/genkit/go/genkit" 631 | "github.com/googleapis/mcp-toolbox-sdk-go/core" 632 | "github.com/googleapis/mcp-toolbox-sdk-go/tbgenkit" 633 | ) 634 | 635 | func main() { 636 | // Make sure to add the error checks 637 | // Update the url to point to your server 638 | URL := "http://127.0.0.1:5000" 639 | ctx := context.Background() 640 | g := genkit.Init(ctx) 641 | 642 | client, err := core.NewToolboxClient(URL) 643 | 644 | // Framework agnostic tool 645 | tool, err := client.LoadTool("toolName", ctx) 646 | 647 | // Convert the tool using the tbgenkit package 648 | // Use this tool with Genkit Go 649 | genkitTool, err := tbgenkit.ToGenkitTool(tool, g) 650 | if err != nil { 651 | log.Fatalf("Failed to convert tool: %v\n", err) 652 | } 653 | log.Printf("Successfully converted tool: %s", genkitTool.Name()) 654 | } 655 | ``` 656 | 657 | </details> 658 | <details> 659 | <summary>Go GenAI</summary> 660 | 661 | 1. Install [Toolbox Go SDK][toolbox-go]: 662 | 663 | ```bash 664 | go get github.com/googleapis/mcp-toolbox-sdk-go 665 | ``` 666 | 667 | 2. Load tools: 668 | 669 | ```go 670 | package main 671 | 672 | import ( 673 | "context" 674 | "encoding/json" 675 | 676 | "github.com/googleapis/mcp-toolbox-sdk-go/core" 677 | "google.golang.org/genai" 678 | ) 679 | 680 | func main() { 681 | // Make sure to add the error checks 682 | // Update the url to point to your server 683 | URL := "http://127.0.0.1:5000" 684 | ctx := context.Background() 685 | 686 | client, err := core.NewToolboxClient(URL) 687 | 688 | // Framework agnostic tool 689 | tool, err := client.LoadTool("toolName", ctx) 690 | 691 | // Fetch the tool's input schema 692 | inputschema, err := tool.InputSchema() 693 | 694 | var schema *genai.Schema 695 | _ = json.Unmarshal(inputschema, &schema) 696 | 697 | funcDeclaration := &genai.FunctionDeclaration{ 698 | Name: tool.Name(), 699 | Description: tool.Description(), 700 | Parameters: schema, 701 | } 702 | 703 | // Use this tool with Go GenAI 704 | genAITool := &genai.Tool{ 705 | FunctionDeclarations: []*genai.FunctionDeclaration{funcDeclaration}, 706 | } 707 | } 708 | ``` 709 | 710 | </details> 711 | <details> 712 | <summary>OpenAI Go</summary> 713 | 714 | 1. Install [Toolbox Go SDK][toolbox-go]: 715 | 716 | ```bash 717 | go get github.com/googleapis/mcp-toolbox-sdk-go 718 | ``` 719 | 720 | 2. Load tools: 721 | 722 | ```go 723 | package main 724 | 725 | import ( 726 | "context" 727 | "encoding/json" 728 | 729 | "github.com/googleapis/mcp-toolbox-sdk-go/core" 730 | openai "github.com/openai/openai-go" 731 | ) 732 | 733 | func main() { 734 | // Make sure to add the error checks 735 | // Update the url to point to your server 736 | URL := "http://127.0.0.1:5000" 737 | ctx := context.Background() 738 | 739 | client, err := core.NewToolboxClient(URL) 740 | 741 | // Framework agnostic tool 742 | tool, err := client.LoadTool("toolName", ctx) 743 | 744 | // Fetch the tool's input schema 745 | inputschema, err := tool.InputSchema() 746 | 747 | var paramsSchema openai.FunctionParameters 748 | _ = json.Unmarshal(inputschema, ¶msSchema) 749 | 750 | // Use this tool with OpenAI Go 751 | openAITool := openai.ChatCompletionToolParam{ 752 | Function: openai.FunctionDefinitionParam{ 753 | Name: tool.Name(), 754 | Description: openai.String(tool.Description()), 755 | Parameters: paramsSchema, 756 | }, 757 | } 758 | 759 | } 760 | ``` 761 | 762 | </details> 763 | </details> 764 | </blockquote> 765 | </details> 766 | 767 | ## Configuration 768 | 769 | The primary way to configure Toolbox is through the `tools.yaml` file. If you 770 | have multiple files, you can tell toolbox which to load with the `--tools-file 771 | tools.yaml` flag. 772 | 773 | You can find more detailed reference documentation to all resource types in the 774 | [Resources](https://googleapis.github.io/genai-toolbox/resources/). 775 | 776 | ### Sources 777 | 778 | The `sources` section of your `tools.yaml` defines what data sources your 779 | Toolbox should have access to. Most tools will have at least one source to 780 | execute against. 781 | 782 | ```yaml 783 | sources: 784 | my-pg-source: 785 | kind: postgres 786 | host: 127.0.0.1 787 | port: 5432 788 | database: toolbox_db 789 | user: toolbox_user 790 | password: my-password 791 | ``` 792 | 793 | For more details on configuring different types of sources, see the 794 | [Sources](https://googleapis.github.io/genai-toolbox/resources/sources). 795 | 796 | ### Tools 797 | 798 | The `tools` section of a `tools.yaml` define the actions an agent can take: what 799 | kind of tool it is, which source(s) it affects, what parameters it uses, etc. 800 | 801 | ```yaml 802 | tools: 803 | search-hotels-by-name: 804 | kind: postgres-sql 805 | source: my-pg-source 806 | description: Search for hotels based on name. 807 | parameters: 808 | - name: name 809 | type: string 810 | description: The name of the hotel. 811 | statement: SELECT * FROM hotels WHERE name ILIKE '%' || $1 || '%'; 812 | ``` 813 | 814 | For more details on configuring different types of tools, see the 815 | [Tools](https://googleapis.github.io/genai-toolbox/resources/tools). 816 | 817 | ### Toolsets 818 | 819 | The `toolsets` section of your `tools.yaml` allows you to define groups of tools 820 | that you want to be able to load together. This can be useful for defining 821 | different groups based on agent or application. 822 | 823 | ```yaml 824 | toolsets: 825 | my_first_toolset: 826 | - my_first_tool 827 | - my_second_tool 828 | my_second_toolset: 829 | - my_second_tool 830 | - my_third_tool 831 | ``` 832 | 833 | You can load toolsets by name: 834 | 835 | ```python 836 | # This will load all tools 837 | all_tools = client.load_toolset() 838 | 839 | # This will only load the tools listed in 'my_second_toolset' 840 | my_second_toolset = client.load_toolset("my_second_toolset") 841 | ``` 842 | 843 | ## Versioning 844 | 845 | This project uses [semantic versioning](https://semver.org/) (`MAJOR.MINOR.PATCH`). 846 | Since the project is in a pre-release stage (version `0.x.y`), we follow the 847 | standard conventions for initial development: 848 | 849 | ### Pre-1.0.0 Versioning 850 | 851 | While the major version is `0`, the public API should be considered unstable. 852 | The version will be incremented as follows: 853 | 854 | - **`0.MINOR.PATCH`**: The **MINOR** version is incremented when we add 855 | new functionality or make breaking, incompatible API changes. 856 | - **`0.MINOR.PATCH`**: The **PATCH** version is incremented for 857 | backward-compatible bug fixes. 858 | 859 | ### Post-1.0.0 Versioning 860 | 861 | Once the project reaches a stable `1.0.0` release, the versioning will follow 862 | the more common convention: 863 | 864 | - **`MAJOR.MINOR.PATCH`**: Incremented for incompatible API changes. 865 | - **`MAJOR.MINOR.PATCH`**: Incremented for new, backward-compatible functionality. 866 | - **`MAJOR.MINOR.PATCH`**: Incremented for backward-compatible bug fixes. 867 | 868 | The public API that this applies to is the CLI associated with Toolbox, the 869 | interactions with official SDKs, and the definitions in the `tools.yaml` file. 870 | 871 | ## Contributing 872 | 873 | Contributions are welcome. Please, see the [CONTRIBUTING](CONTRIBUTING.md) 874 | to get started. 875 | 876 | Please note that this project is released with a Contributor Code of Conduct. 877 | By participating in this project you agree to abide by its terms. See 878 | [Contributor Code of Conduct](CODE_OF_CONDUCT.md) for more information. 879 | 880 | ## Community 881 | 882 | Join our [discord community](https://discord.gg/GQrFB3Ec3W) to connect with our developers! 883 | ``` -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- ```markdown 1 | # Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of 9 | experience, education, socio-economic status, nationality, personal appearance, 10 | race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or reject 41 | comments, commits, code, wiki edits, issues, and other contributions that are 42 | not aligned to this Code of Conduct, or to ban temporarily or permanently any 43 | contributor for other behaviors that they deem inappropriate, threatening, 44 | offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | This Code of Conduct also applies outside the project spaces when the Project 56 | Steward has a reasonable belief that an individual's behavior may have a 57 | negative impact on the project or its community. 58 | 59 | ## Conflict Resolution 60 | 61 | We do not believe that all conflict is bad; healthy debate and disagreement 62 | often yield positive results. However, it is never okay to be disrespectful or 63 | to engage in behavior that violates the project’s code of conduct. 64 | 65 | If you see someone violating the code of conduct, you are encouraged to address 66 | the behavior directly with those involved. Many issues can be resolved quickly 67 | and easily, and this gives people more control over the outcome of their 68 | dispute. If you are unable to resolve the matter for any reason, or if the 69 | behavior is threatening or harassing, report it. We are dedicated to providing 70 | an environment where participants feel welcome and safe. 71 | 72 | Reports should be directed to @googleapis/senseai-eco, the 73 | Project Steward(s) for *Project Toolbox*. It is the Project Steward’s duty to 74 | receive and address reported violations of the code of conduct. They will then 75 | work with a committee consisting of representatives from the Open Source 76 | Programs Office and the Google Open Source Strategy team. If for any reason you 77 | are uncomfortable reaching out to the Project Steward, please email 78 | <[email protected]>. 79 | 80 | We will investigate every complaint, but you may not receive a direct response. 81 | We will use our discretion in determining when and how to follow up on reported 82 | incidents, which may range from not taking action to permanent expulsion from 83 | the project and project-sponsored spaces. We will notify the accused of the 84 | report and provide them an opportunity to discuss it before any action is taken. 85 | The identity of the reporter will be omitted from the details of the report 86 | supplied to the accused. In potentially harmful situations, such as ongoing 87 | harassment or threats to anyone's safety, we may take action without notice. 88 | 89 | ## Attribution 90 | 91 | This Code of Conduct is adapted from the Contributor Covenant, version 1.4, 92 | available at 93 | <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html> 94 | ``` -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- ```markdown 1 | # How to contribute 2 | 3 | We'd love to accept your patches and contributions to this project. 4 | 5 | ## Before you begin 6 | 7 | ### Sign our Contributor License Agreement 8 | 9 | Contributions to this project must be accompanied by a 10 | [Contributor License Agreement](https://cla.developers.google.com/about) (CLA). 11 | You (or your employer) retain the copyright to your contribution; this simply 12 | gives us permission to use and redistribute your contributions as part of the 13 | project. 14 | 15 | If you or your current employer have already signed the Google CLA (even if it 16 | was for a different project), you probably don't need to do it again. 17 | 18 | Visit <https://cla.developers.google.com/> to see your current agreements or to 19 | sign a new one. 20 | 21 | ### Review our community guidelines 22 | 23 | This project follows 24 | [Google's Open Source Community Guidelines](https://opensource.google/conduct/). 25 | 26 | ## Contribution process 27 | 28 | > [!NOTE] 29 | > New contributions should always include both unit and integration tests. 30 | 31 | All submissions, including submissions by project members, require review. We 32 | use GitHub pull requests for this purpose. Consult 33 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more 34 | information on using pull requests. 35 | 36 | ### Code reviews 37 | 38 | * Within 2-5 days, a reviewer will review your PR. They may approve it, or request 39 | changes. 40 | * When requesting changes, reviewers should self-assign the PR to ensure 41 | they are aware of any updates. 42 | * If additional changes are needed, push additional commits to your PR branch - 43 | this helps the reviewer know which parts of the PR have changed. 44 | * Commits will be 45 | squashed when merged. 46 | * Please follow up with changes promptly. 47 | * If a PR is awaiting changes by the 48 | author for more than 10 days, maintainers may mark that PR as Draft. PRs that 49 | are inactive for more than 30 days may be closed. 50 | 51 | ## Adding a New Database Source or Tool 52 | 53 | Please create an 54 | [issue](https://github.com/googleapis/genai-toolbox/issues) before 55 | implementation to ensure we can accept the contribution and no duplicated work. 56 | This issue should include an overview of the API design. If you have any 57 | questions, reach out on our [Discord](https://discord.gg/Dmm69peqjh) to chat 58 | directly with the team. 59 | 60 | > [!NOTE] 61 | > New tools can be added for [pre-existing data 62 | > sources](https://github.com/googleapis/genai-toolbox/tree/main/internal/sources). 63 | > However, any new database source should also include at least one new tool 64 | > type. 65 | 66 | ### Adding a New Database Source 67 | 68 | We recommend looking at an [example source 69 | implementation](https://github.com/googleapis/genai-toolbox/blob/main/internal/sources/postgres/postgres.go). 70 | 71 | * **Create a new directory** under `internal/sources` for your database type 72 | (e.g., `internal/sources/newdb`). 73 | * **Define a configuration struct** for your data source in a file named 74 | `newdb.go`. Create a `Config` struct to include all the necessary parameters 75 | for connecting to the database (e.g., host, port, username, password, database 76 | name) and a `Source` struct to store necessary parameters for tools (e.g., 77 | Name, Kind, connection object, additional config). 78 | * **Implement the 79 | [`SourceConfig`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/sources/sources.go#L57) 80 | interface**. This interface requires two methods: 81 | * `SourceConfigKind() string`: Returns a unique string identifier for your 82 | data source (e.g., `"newdb"`). 83 | * `Initialize(ctx context.Context, tracer trace.Tracer) (Source, error)`: 84 | Creates a new instance of your data source and establishes a connection to 85 | the database. 86 | * **Implement the 87 | [`Source`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/sources/sources.go#L63) 88 | interface**. This interface requires one method: 89 | * `SourceKind() string`: Returns the same string identifier as `SourceConfigKind()`. 90 | * **Implement `init()`** to register the new Source. 91 | * **Implement Unit Tests** in a file named `newdb_test.go`. 92 | 93 | ### Adding a New Tool 94 | 95 | > [!NOTE] 96 | > Please follow the tool naming convention detailed [here](./DEVELOPER.md#tool-naming-conventions). 97 | 98 | We recommend looking at an [example tool 99 | implementation](https://github.com/googleapis/genai-toolbox/tree/main/internal/tools/postgres/postgressql). 100 | 101 | * **Create a new directory** under `internal/tools` for your tool type (e.g., 102 | `internal/tools/newdb` or `internal/tools/newdb<tool_name>`). 103 | * **Define a configuration struct** for your tool in a file named `newdbtool.go`. 104 | Create a `Config` struct and a `Tool` struct to store necessary parameters for 105 | tools. 106 | * **Implement the 107 | [`ToolConfig`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/tools/tools.go#L61) 108 | interface**. This interface requires one method: 109 | * `ToolConfigKind() string`: Returns a unique string identifier for your tool 110 | (e.g., `"newdb"`). 111 | * `Initialize(sources map[string]Source) (Tool, error)`: Creates a new 112 | instance of your tool and validates that it can connect to the specified 113 | data source. 114 | * **Implement the `Tool` interface**. This interface requires the following 115 | methods: 116 | * `Invoke(ctx context.Context, params map[string]any) ([]any, error)`: 117 | Executes the operation on the database using the provided parameters. 118 | * `ParseParams(data map[string]any, claims map[string]map[string]any) 119 | (ParamValues, error)`: Parses and validates the input parameters. 120 | * `Manifest() Manifest`: Returns a manifest describing the tool's capabilities 121 | and parameters. 122 | * `McpManifest() McpManifest`: Returns an MCP manifest describing the tool for 123 | use with the Model Context Protocol. 124 | * `Authorized(services []string) bool`: Checks if the tool is authorized to 125 | run based on the provided authentication services. 126 | * **Implement `init()`** to register the new Tool. 127 | * **Implement Unit Tests** in a file named `newdb_test.go`. 128 | 129 | ### Adding Integration Tests 130 | 131 | * **Add a test file** under a new directory `tests/newdb`. 132 | * **Add pre-defined integration test suites** in the 133 | `/tests/newdb/newdb_test.go` that are **required** to be run as long as your 134 | code contains related features. Please check each test suites for the config 135 | defaults, if your source require test suites config updates, please refer to 136 | [config option](./tests/option.go): 137 | 138 | 1. [RunToolGetTest][tool-get]: tests for the `GET` endpoint that returns the 139 | tool's manifest. 140 | 141 | 2. [RunToolInvokeTest][tool-call]: tests for tool calling through the native 142 | Toolbox endpoints. 143 | 144 | 3. [RunMCPToolCallMethod][mcp-call]: tests tool calling through the MCP 145 | endpoints. 146 | 147 | 4. (Optional) [RunExecuteSqlToolInvokeTest][execute-sql]: tests an 148 | `execute-sql` tool for any source. Only run this test if you are adding an 149 | `execute-sql` tool. 150 | 151 | 5. (Optional) [RunToolInvokeWithTemplateParameters][temp-param]: tests for [template 152 | parameters][temp-param-doc]. Only run this test if template 153 | parameters apply to your tool. 154 | 155 | * **Add the new database to the integration test workflow** in 156 | [integration.cloudbuild.yaml](.ci/integration.cloudbuild.yaml). 157 | 158 | [tool-get]: 159 | https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/tests/tool.go#L31 160 | [tool-call]: 161 | <https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/tests/tool.go#L79> 162 | [mcp-call]: 163 | https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/tests/tool.go#L554 164 | [execute-sql]: 165 | <https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/tests/tool.go#L431> 166 | [temp-param]: 167 | <https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/tests/tool.go#L297> 168 | [temp-param-doc]: 169 | https://googleapis.github.io/genai-toolbox/resources/tools/#template-parameters 170 | 171 | ### Adding Documentation 172 | 173 | * **Update the documentation** to include information about your new data source 174 | and tool. This includes: 175 | * Adding a new page to the `docs/en/resources/sources` directory for your data 176 | source. 177 | * Adding a new page to the `docs/en/resources/tools` directory for your tool. 178 | 179 | * **(Optional) Add samples** to the `docs/en/samples/<newdb>` directory. 180 | 181 | ### (Optional) Adding Prebuilt Tools 182 | 183 | You can provide developers with a set of "build-time" tools to aid common 184 | software development user journeys like viewing and creating tables/collections 185 | and data. 186 | 187 | * **Create a set of prebuilt tools** by defining a new `tools.yaml` and adding 188 | it to `internal/tools`. Make sure the file name matches the source (i.e. for 189 | source "alloydb-postgres" create a file named "alloydb-postgres.yaml"). 190 | * **Update `cmd/root.go`** to add new source to the `prebuilt` flag. 191 | * **Add tests** in 192 | [internal/prebuiltconfigs/prebuiltconfigs_test.go](internal/prebuiltconfigs/prebuiltconfigs_test.go) 193 | and [cmd/root_test.go](cmd/root_test.go). 194 | 195 | ## Submitting a Pull Request 196 | 197 | Submit a pull request to the repository with your changes. Be sure to include a 198 | detailed description of your changes and any requests for long term testing 199 | resources. 200 | 201 | * **Title:** All pull request title should follow the formatting of 202 | [Conventional 203 | Commit](https://www.conventionalcommits.org/) guidelines: `<type>[optional 204 | scope]: description`. For example, if you are adding a new field in postgres 205 | source, the title should be `feat(source/postgres): add support for 206 | "new-field" field in postgres source`. 207 | 208 | Here are some commonly used `type` in this GitHub repo. 209 | 210 | | **type** | **description** | 211 | |-----------------|-------------------------------------------------------------------------------------------------------| 212 | | Breaking Change | Anything with this type of a `!` after the type/scope introduces a breaking change. | 213 | | feat | Adding a new feature to the codebase. | 214 | | fix | Fixing a bug or typo in the codebase. This does not include fixing docs. | 215 | | test | Changes made to test files. | 216 | | ci | Changes made to the cicd configuration files or scripts. | 217 | | docs | Documentation-related PRs, including fixes on docs. | 218 | | chore | Other small tasks or updates that don't fall into any of the above types. | 219 | | refactor | Change src code but unlike feat, there are no tests broke and no line lost coverage. | 220 | | revert | Revert changes made in another commit. | 221 | | style | Update src code, with only formatting and whitespace updates (e.g. code formatter or linter changes). | 222 | 223 | Pull requests should always add scope whenever possible. The scope is 224 | formatted as `<scope-type>/<scope-kind>` (e.g., `sources/postgres`, or 225 | `tools/mssql-sql`). 226 | 227 | Ideally, **each PR covers only one scope**, if this is 228 | inevitable, multiple scopes can be seaparated with a comma (e.g. 229 | `sources/postgres,sources/alloydbpg`). If the PR covers multiple `scope-type` 230 | (such as adding a new database), you can disregard the `scope-type`, e.g. 231 | `feat(new-db): adding support for new-db source and tool`. 232 | 233 | * **PR Description:** PR description should **always** be included. It should 234 | include a concise description of the changes, it's impact, along with a 235 | summary of the solution. If the PR is related to a specific issue, the issue 236 | number should be mentioned in the PR description (e.g. `Fixes #1`). 237 | ``` -------------------------------------------------------------------------------- /cmd/version.txt: -------------------------------------------------------------------------------- ``` 1 | 0.17.0 2 | ``` -------------------------------------------------------------------------------- /.github/label-sync.yml: -------------------------------------------------------------------------------- ```yaml 1 | --- 2 | ignored: true 3 | ``` -------------------------------------------------------------------------------- /.hugo/assets/scss/_styles_project.scss: -------------------------------------------------------------------------------- ```scss 1 | @import 'td/code-dark'; ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/golden.txt: -------------------------------------------------------------------------------- ``` 1 | Hilton Basel 2 | Hyatt Regency 3 | book ``` -------------------------------------------------------------------------------- /.hugo/assets/scss/_variables_project.scss: -------------------------------------------------------------------------------- ```scss 1 | $primary: #80a7e9; 2 | $secondary: #4484f4; 3 | ``` -------------------------------------------------------------------------------- /.hugo/layouts/partials/td/render-heading.html: -------------------------------------------------------------------------------- ```html 1 | {{ template "partials/td/render-heading.html" . }} 2 | ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/python/adk/requirements.txt: -------------------------------------------------------------------------------- ``` 1 | google-adk==1.15.0 2 | toolbox-core==0.5.2 3 | pytest==8.4.2 ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/python/core/requirements.txt: -------------------------------------------------------------------------------- ``` 1 | google-genai==1.42.0 2 | toolbox-core==0.5.2 3 | pytest==8.4.2 4 | ``` -------------------------------------------------------------------------------- /.hugo/layouts/robot.txt: -------------------------------------------------------------------------------- ``` 1 | User-agent: * 2 | {{ if eq hugo.Environment "preview" }} 3 | Disallow: /* 4 | {{ end }} ``` -------------------------------------------------------------------------------- /.hugo/layouts/partials/hooks/head-end.html: -------------------------------------------------------------------------------- ```html 1 | <script src='{{ .Site.BaseURL }}js/w3.js' type="application/x-javascript"></script> 2 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/alloydbainl/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "AlloyDB AI NL" 3 | type: docs 4 | weight: 1 5 | description: > 6 | AlloyDB AI NL Tool. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/concepts/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Concepts" 3 | type: docs 4 | weight: 2 5 | description: > 6 | Some core concepts in Toolbox 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/dataform/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Dataform" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Dataform. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/http/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "HTTP" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with HTTP Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/python/llamaindex/requirements.txt: -------------------------------------------------------------------------------- ``` 1 | llama-index==0.14.3 2 | llama-index-llms-google-genai==0.6.0 3 | toolbox-llamaindex==0.5.2 4 | pytest==8.4.2 5 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/neo4j/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Neo4j" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Neo4j Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/redis/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Redis" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Redis Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/utility/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Utility tools" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that provide utility. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudsql/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Cloud SQL" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Cloud SQL. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/dgraph/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Dgraph" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Dgraph Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/looker/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Looker" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Looker Sources. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/sqlite/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "SQLite" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with SQLite Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/valkey/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Valkey" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Valkey Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/oracle/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Oracle" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Oracle Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/spanner/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Spanner" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Spanner Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/samples/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Samples" 3 | type: docs 4 | weight: 5 5 | description: > 6 | Samples and guides for using Toolbox. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/bigquery/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "BigQuery" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with BigQuery Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/bigtable/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Bigtable" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Bigtable Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/dataplex/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Dataplex" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Dataplex Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firebird/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Firebird" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Firebird Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/yuagbytedb/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "YugabyteDB" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Valkey Sources. 7 | --- ``` -------------------------------------------------------------------------------- /.hugo/archetypes/default.md: -------------------------------------------------------------------------------- ```markdown 1 | +++ 2 | date = '{{ .Date }}' 3 | draft = true 4 | title = '{{ replace .File.ContentBaseName "-" " " | title }}' 5 | +++ 6 | ``` -------------------------------------------------------------------------------- /docs/en/getting-started/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Getting Started" 3 | type: docs 4 | weight: 1 5 | description: > 6 | How to get started with Toolbox. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/mongodb/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "MongoDB" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with the MongoDB Source. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cassandra/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Cassandra" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Cassandra Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/couchbase/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Couchbase" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Couchbase Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firestore/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Firestore" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Firestore Sources. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/oceanbase/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "OceanBase" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with OceanBase Sources. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/python/langchain/requirements.txt: -------------------------------------------------------------------------------- ``` 1 | langchain==0.3.27 2 | langchain-google-vertexai==2.1.2 3 | langgraph==0.6.8 4 | toolbox-langchain==0.5.2 5 | pytest==8.4.2 6 | ``` -------------------------------------------------------------------------------- /docs/en/samples/looker/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Looker" 3 | type: docs 4 | weight: 1 5 | description: > 6 | How to get started with Toolbox using Looker. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/about/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "About" 3 | type: docs 4 | weight: 6 5 | description: > 6 | A list of other information related to Toolbox. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/samples/alloydb/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "AlloyDB" 3 | type: docs 4 | weight: 1 5 | description: > 6 | How to get started with Toolbox using AlloyDB. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/sdks/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "SDKs" 3 | type: docs 4 | weight: 6 5 | description: > 6 | Client SDKs to connect to the MCP Toolbox server. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/alloydb/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "AlloyDB for PostgreSQL" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools for AlloyDB for PostgreSQL. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/samples/bigquery/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "BigQuery" 3 | type: docs 4 | weight: 1 5 | description: > 6 | How to get started with Toolbox using BigQuery. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/reference/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Reference" 3 | type: docs 4 | weight: 7 5 | description: > 6 | This section contains reference documentation. 7 | --- 8 | 9 | ``` -------------------------------------------------------------------------------- /.hugo/package.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "devDependencies": { 3 | "autoprefixer": "^10.4.20", 4 | "postcss": "^8.4.49", 5 | "postcss-cli": "^11.0.0" 6 | } 7 | } 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudmonitoring/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Cloud Monitoring" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Cloud Monitoring source. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /.hugo/layouts/shortcodes/include.html: -------------------------------------------------------------------------------- ```html 1 | {{ $file := .Get 0 }} 2 | {{ (printf "%s%s" .Page.File.Dir $file) | readFile | replaceRE "^---[\\s\\S]+?---" "" | safeHTML }} 3 | ``` -------------------------------------------------------------------------------- /docs/en/resources/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Resources" 3 | type: docs 4 | weight: 4 5 | description: > 6 | List of reference documentation for resources in Toolbox. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/clickhouse/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "ClickHouse" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools for interacting with ClickHouse databases and tables. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/mysql/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "MySQL" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with MySQL Sources, such as Cloud SQL for MySQL. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/how-to/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "How-to" 3 | type: docs 4 | weight: 3 5 | description: > 6 | List of guides detailing how to do different things with Toolbox. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/trino/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Trino" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Trino Sources, such as distributed SQL query engine. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/tidb/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "TiDB" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with TiDB Sources, such as TiDB Cloud and self-hosted TiDB. 7 | --- 8 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/mssql/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "SQL Server" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with SQL Server Sources, such as CloudSQL for SQL Server. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/postgres/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Postgres" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Tools that work with Postgres Sources, such as Cloud SQL for Postgres and AlloyDB. 7 | --- ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/python/__init__.py: -------------------------------------------------------------------------------- ```python 1 | # This file makes the 'quickstart' directory a Python package. 2 | 3 | # You can include any package-level initialization logic here if needed. 4 | # For now, this file is empty. 5 | ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Connect from your IDE" 3 | type: docs 4 | weight: 1 5 | description: > 6 | List of guides detailing how to connect your AI tools (IDEs) to Toolbox using MCP. 7 | aliases: 8 | - /how-to/connect_tools_using_mcp 9 | --- 10 | ``` -------------------------------------------------------------------------------- /docs/en/samples/alloydb/ai-nl/index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Getting started with alloydb-ai-nl tool" 3 | type: docs 4 | weight: 30 5 | description: > 6 | An end to end tutorial for building an ADK agent using the AlloyDB AI NL tool. 7 | --- 8 | 9 | {{< ipynb "alloydb_ai_nl.ipynb" >}} 10 | ``` -------------------------------------------------------------------------------- /.hugo/layouts/index.llms-full.txt: -------------------------------------------------------------------------------- ``` 1 | {{ .Site.Params.description }} 2 | 3 | {{ range .Site.Sections }} 4 | # {{ .Title }} 5 | {{ .Description }} 6 | {{ range .Pages }} 7 | # {{ .Title }} 8 | {{ .Description }} 9 | {{ .RawContent }} 10 | {{ range .Pages }} 11 | # {{ .Title }} 12 | {{ .Description }} 13 | {{ .RawContent }} 14 | {{end }}{{ end }}{{ end }} 15 | ``` -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- ```yaml 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Google Cloud Support 4 | url: https://cloud.google.com/support/ 5 | 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. 6 | ``` -------------------------------------------------------------------------------- /docs/en/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Documentation" 3 | type: docs 4 | notoc: false 5 | weight: 1 6 | description: > 7 | All of Toolbox's documentation. 8 | --- 9 | 10 | <html> 11 | <head> 12 | <link rel="canonical" href="getting-started/introduction/"/> 13 | <meta http-equiv="refresh" content="0;url=getting-started/introduction/"/> 14 | </head> 15 | </html> 16 | ``` -------------------------------------------------------------------------------- /.hugo/layouts/index.llms.txt: -------------------------------------------------------------------------------- ``` 1 | # {{ .Site.Title }} 2 | 3 | > {{ .Site.Params.description }} 4 | 5 | ## Docs 6 | {{ range .Site.Sections }} 7 | ### {{ .Title }} 8 | 9 | {{ .Description }}{{ range .Pages }}- [{{ .Title }}]({{ .Permalink }}): {{ .Description }}{{ range .Pages }} - [{{ .Title }}]({{ .Permalink }}): {{ .Description }}{{end }}{{ end }}{{ end }} 10 | ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/js/genAI/package.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "name": "genai", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "quickstart.js", 6 | "type" : "module", 7 | "scripts": { 8 | "test": "node --test" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "@google/genai": "^1.17.0", 15 | "@toolbox-sdk/core": "^0.1.2" 16 | } 17 | } 18 | ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/js/genkit/package.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "name": "genkit", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "quickstart.js", 6 | "type" : "module", 7 | "scripts": { 8 | "test": "node --test" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "@genkit-ai/googleai": "^1.18.0", 15 | "@toolbox-sdk/core": "^0.1.2", 16 | "genkit": "^1.18.0" 17 | } 18 | } 19 | ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/alloydb_pg_mcp.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "AlloyDB using MCP" 3 | type: docs 4 | weight: 2 5 | description: > 6 | Connect your IDE to AlloyDB using Toolbox. 7 | --- 8 | <html> 9 | <head> 10 | <link rel="canonical" href="https://cloud.google.com/alloydb/docs/connect-ide-using-mcp-toolbox"/> 11 | <meta http-equiv="refresh" content="0;url=https://cloud.google.com/alloydb/docs/connect-ide-using-mcp-toolbox"/> 12 | </head> 13 | </html> 14 | ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/spanner_mcp.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Spanner using MCP" 3 | type: docs 4 | weight: 2 5 | description: > 6 | Connect your IDE to Spanner using Toolbox. 7 | --- 8 | <html> 9 | <head> 10 | <link rel="canonical" href="https://cloud.google.com/spanner/docs/pre-built-tools-with-mcp-toolbox"/> 11 | <meta http-equiv="refresh" content="0;url=https://cloud.google.com/spanner/docs/pre-built-tools-with-mcp-toolbox"/> 12 | </head> 13 | </html> 14 | ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/bigquery_mcp.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "BigQuery using MCP" 3 | type: docs 4 | weight: 2 5 | description: > 6 | Connect your IDE to BigQuery using Toolbox. 7 | --- 8 | <html> 9 | <head> 10 | <link rel="canonical" href="https://cloud.google.com/bigquery/docs/pre-built-tools-with-mcp-toolbox"/> 11 | <meta http-equiv="refresh" content="0;url=https://cloud.google.com/bigquery/docs/pre-built-tools-with-mcp-toolbox"/> 12 | </head> 13 | </html> 14 | ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/js/llamaindex/package.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "name": "llamaindex", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "quickstart.js", 6 | "type": "module", 7 | "scripts": { 8 | "test": "node --test" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "@llamaindex/google": "^0.3.20", 15 | "@llamaindex/workflow": "^1.1.22", 16 | "@toolbox-sdk/core": "^0.1.2", 17 | "llamaindex": "^0.12.0" 18 | } 19 | } 20 | ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/js/langchain/package.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "name": "langchain", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "quickstart.js", 6 | "type": "module", 7 | "scripts": { 8 | "test": "node --test" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "@langchain/google-genai": "^0.2.17", 15 | "@langchain/langgraph": "^0.4.9", 16 | "@toolbox-sdk/core": "^0.1.2", 17 | "langchain": "^0.3.33" 18 | } 19 | } 20 | ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/alloydb_pg_admin_mcp.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "AlloyDB Admin API using MCP" 3 | type: docs 4 | weight: 2 5 | description: > 6 | Create your AlloyDB database with MCP Toolbox. 7 | --- 8 | 9 | <html> 10 | <head> 11 | <link rel="canonical" href="https://cloud.google.com/alloydb/docs/create-database-with-mcp-toolbox"/> 12 | <meta http-equiv="refresh" content="0;url=https://cloud.google.com/alloydb/docs/create-database-with-mcp-toolbox"/> 13 | </head> 14 | </html> 15 | ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/firestore_mcp.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Firestore using MCP" 3 | type: docs 4 | weight: 2 5 | description: > 6 | Connect your IDE to Firestore using Toolbox. 7 | --- 8 | 9 | <html> 10 | <head> 11 | <link rel="canonical" href="https://cloud.google.com/firestore/native/docs/connect-ide-using-mcp-toolbox"/> 12 | <meta http-equiv="refresh" content="0;url=https://cloud.google.com/firestore/native/docs/connect-ide-using-mcp-toolbox"/> 13 | </head> 14 | </html> 15 | ``` -------------------------------------------------------------------------------- /docs/en/sdks/go-sdk.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Go SDK" 3 | weight: 2 4 | description: Go lang client SDK 5 | icon: fa-brands fa-golang 6 | manualLink: "https://github.com/googleapis/mcp-toolbox-sdk-go" 7 | manualLinkTarget: _blank 8 | --- 9 | 10 | <html> 11 | <head> 12 | <link rel="canonical" href="https://github.com/googleapis/mcp-toolbox-sdk-go"/> 13 | <meta http-equiv="refresh" content="0;url=https://github.com/googleapis/mcp-toolbox-sdk-go"/> 14 | </head> 15 | </html> 16 | ``` -------------------------------------------------------------------------------- /docs/en/sdks/js-sdk.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "JS SDK" 3 | weight: 2 4 | description: Javascript client SDK 5 | icon: fa-brands fa-node-js 6 | manualLink: "https://github.com/googleapis/mcp-toolbox-sdk-js" 7 | manualLinkTarget: _blank 8 | --- 9 | 10 | <html> 11 | <head> 12 | <link rel="canonical" href="https://github.com/googleapis/mcp-toolbox-sdk-js"/> 13 | <meta http-equiv="refresh" content="0;url=https://github.com/googleapis/mcp-toolbox-sdk-js"/> 14 | </head> 15 | </html> 16 | ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/cloud_sql_mysql_mcp.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Cloud SQL for MySQL using MCP" 3 | type: docs 4 | weight: 2 5 | description: > 6 | Connect your IDE to Cloud SQL for MySQL using Toolbox. 7 | --- 8 | <html> 9 | <head> 10 | <link rel="canonical" href="https://cloud.google.com/sql/docs/mysql/pre-built-tools-with-mcp-toolbox"/> 11 | <meta http-equiv="refresh" content="0;url=https://cloud.google.com/sql/docs/mysql/pre-built-tools-with-mcp-toolbox"/> 12 | </head> 13 | </html> 14 | ``` -------------------------------------------------------------------------------- /docs/en/sdks/python-sdk.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Python SDK" 3 | weight: 2 4 | description: Python client SDK 5 | icon: fa-brands fa-python 6 | manualLink: "https://github.com/googleapis/mcp-toolbox-sdk-python" 7 | manualLinkTarget: _blank 8 | --- 9 | 10 | <html> 11 | <head> 12 | <link rel="canonical" href="https://github.com/googleapis/mcp-toolbox-sdk-python"/> 13 | <meta http-equiv="refresh" content="0;url=https://github.com/googleapis/mcp-toolbox-sdk-python"/> 14 | </head> 15 | </html> 16 | ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/cloud_sql_pg_mcp.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Cloud SQL for Postgres using MCP" 3 | type: docs 4 | weight: 2 5 | description: > 6 | Connect your IDE to Cloud SQL for Postgres using Toolbox. 7 | --- 8 | <html> 9 | <head> 10 | <link rel="canonical" href="https://cloud.google.com/sql/docs/postgres/pre-built-tools-with-mcp-toolbox"/> 11 | <meta http-equiv="refresh" content="0;url=https://cloud.google.com/sql/docs/postgres/pre-built-tools-with-mcp-toolbox"/> 12 | </head> 13 | </html> 14 | ``` -------------------------------------------------------------------------------- /docs/en/how-to/connect-ide/cloud_sql_mssql_mcp.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Cloud SQL for SQL Server using MCP" 3 | type: docs 4 | weight: 2 5 | description: > 6 | Connect your IDE to Cloud SQL for SQL Server using Toolbox. 7 | --- 8 | <html> 9 | <head> 10 | <link rel="canonical" href="https://cloud.google.com/sql/docs/sqlserver/pre-built-tools-with-mcp-toolbox"/> 11 | <meta http-equiv="refresh" content="0;url=https://cloud.google.com/sql/docs/sqlserver/pre-built-tools-with-mcp-toolbox"/> 12 | </head> 13 | </html> 14 | ``` -------------------------------------------------------------------------------- /.github/renovate.json5: -------------------------------------------------------------------------------- ``` 1 | { 2 | extends: [ 3 | 'config:recommended', 4 | ':semanticCommitTypeAll(chore)', 5 | ':ignoreUnstable', 6 | ':separateMajorReleases', 7 | ':prConcurrentLimitNone', 8 | ':prHourlyLimitNone', 9 | ':preserveSemverRanges', 10 | ], 11 | minimumReleaseAge: '3', 12 | rebaseWhen: 'conflicted', 13 | dependencyDashboardLabels: [ 14 | 'type: process', 15 | ], 16 | "postUpdateOptions": [ 17 | "gomodTidy" 18 | ], 19 | packageRules: [ 20 | { 21 | groupName: 'GitHub Actions', 22 | matchManagers: [ 23 | 'github-actions', 24 | ], 25 | pinDigests: true, 26 | }, 27 | ], 28 | } 29 | ``` -------------------------------------------------------------------------------- /.hugo/layouts/partials/navbar-version-selector.html: -------------------------------------------------------------------------------- ```html 1 | {{ if .Site.Params.versions -}} 2 | <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 3 | {{ .Site.Params.version_menu }} 4 | </a> 5 | <div class="dropdown-menu" aria-labelledby="navbarDropdown"> 6 | <div w3-include-html="/genai-toolbox/releases.releases" w3-include-html-default='<a class="dropdown-item" href="/genai-toolbox/dev/">Dev</a>'></div> 7 | <script> 8 | // This must run after the w3.js script has loaded. 9 | w3.includeHTML(); 10 | </script> 11 | </div> 12 | {{ end -}} ``` -------------------------------------------------------------------------------- /.github/auto-label.yaml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2024 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # https://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | enabled: false 16 | ``` -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- ```go 1 | // Copyright 2024 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | package main 16 | 17 | import ( 18 | "github.com/googleapis/genai-toolbox/cmd" 19 | ) 20 | 21 | func main() { 22 | cmd.Execute() 23 | } 24 | ``` -------------------------------------------------------------------------------- /docs/en/getting-started/quickstart/shared/cloud_setup.md: -------------------------------------------------------------------------------- ```markdown 1 | <!-- This file has been used in local_quickstart.md, local_quickstart_go.md & local_quickstart_js.md --> 2 | <!-- [START cloud_setup] --> 3 | If you plan to use **Google Cloud’s Vertex AI** with your agent (e.g., using 4 | `vertexai=True` or a Google GenAI model), follow these one-time setup steps for 5 | local development: 6 | 7 | 1. [Install the Google Cloud CLI](https://cloud.google.com/sdk/docs/install) 8 | 1. [Set up Application Default Credentials 9 | (ADC)](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment) 10 | 1. Set your project and enable Vertex AI 11 | 12 | ```bash 13 | gcloud config set project YOUR_PROJECT_ID 14 | gcloud services enable aiplatform.googleapis.com 15 | ``` 16 | 17 | <!-- [END cloud_setup] --> ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/oracle/oracle-execute-sql.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "oracle-execute-sql" 3 | type: docs 4 | weight: 1 5 | description: > 6 | An "oracle-execute-sql" tool executes a SQL statement against an Oracle database. 7 | aliases: 8 | - /resources/tools/oracle-execute-sql 9 | --- 10 | 11 | ## About 12 | 13 | An `oracle-execute-sql` tool executes a SQL statement against an Oracle 14 | database. It's compatible with the following source: 15 | 16 | - [oracle](../../sources/oracle.md) 17 | 18 | `oracle-execute-sql` takes one input parameter `sql` and runs the sql 19 | statement against the `source`. 20 | 21 | > **Note:** This tool is intended for developer assistant workflows with 22 | > human-in-the-loop and shouldn't be used for production agents. 23 | 24 | ## Example 25 | 26 | ```yaml 27 | tools: 28 | execute_sql_tool: 29 | kind: oracle-execute-sql 30 | source: my-oracle-instance 31 | description: Use this tool to execute sql statement. 32 | ``` -------------------------------------------------------------------------------- /.github/header-checker-lint.yml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2024 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # https://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | allowedCopyrightHolders: 16 | - 'Google LLC' 17 | - 'Oracle' 18 | allowedLicenses: 19 | - 'Apache-2.0' 20 | sourceFileExtensions: 21 | - 'go' 22 | - 'yaml' 23 | - 'yml' 24 | ignoreFiles: 25 | - 'docs/en/getting-started/quickstart/**' 26 | - '**/*oracle*' 27 | 28 | ``` -------------------------------------------------------------------------------- /cmd/options.go: -------------------------------------------------------------------------------- ```go 1 | // Copyright 2024 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | package cmd 16 | 17 | import ( 18 | "io" 19 | ) 20 | 21 | // Option is a function that configures a Command. 22 | type Option func(*Command) 23 | 24 | // WithStreams overrides the default writer. 25 | func WithStreams(out, err io.Writer) Option { 26 | return func(c *Command) { 27 | c.outStream = out 28 | c.errStream = err 29 | } 30 | } 31 | ``` -------------------------------------------------------------------------------- /internal/server/static/index.html: -------------------------------------------------------------------------------- ```html 1 | <!DOCTYPE html> 2 | <html lang="en"> 3 | <head> 4 | <meta charset="UTF-8"> 5 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 | <title>Toolbox UI</title> 7 | <link rel="stylesheet" href="/ui/css/style.css"> 8 | </head> 9 | <body> 10 | <div id="navbar-container" data-active-nav=""></div> 11 | <div id="main-content-container"></div> 12 | 13 | <script src="/ui/js/navbar.js"></script> 14 | <script src="/ui/js/mainContent.js"></script> 15 | <script> 16 | document.addEventListener('DOMContentLoaded', () => { 17 | const navbarContainer = document.getElementById('navbar-container'); 18 | const activeNav = navbarContainer.getAttribute('data-active-nav'); 19 | renderNavbar('navbar-container', activeNav); 20 | renderMainContent('main-content-container', 'homepage-info', getHomepageInstructions()) 21 | }); 22 | </script> 23 | </body> 24 | </html> 25 | ``` -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Description 2 | 3 | > Should include a concise description of the changes (bug or feature), it's 4 | > impact, along with a summary of the solution 5 | 6 | ## PR Checklist 7 | 8 | > Thank you for opening a Pull Request! Before submitting your PR, there are a 9 | > few things you can do to make sure it goes smoothly: 10 | 11 | - [ ] Make sure you reviewed 12 | [CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md) 13 | - [ ] Make sure to open an issue as a 14 | [bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose) 15 | before writing your code! That way we can discuss the change, evaluate 16 | designs, and agree on the general idea 17 | - [ ] Ensure the tests and linter pass 18 | - [ ] Code coverage does not decrease (if any source code was changed) 19 | - [ ] Appropriate docs were updated (if necessary) 20 | - [ ] Make sure to add `!` if this involve a breaking change 21 | 22 | 🛠️ Fixes #<issue_number_goes_here> 23 | ``` -------------------------------------------------------------------------------- /.github/blunderbuss.yml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2025 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # https://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | assign_issues: 16 | - Yuan325 17 | - duwenxin99 18 | - averikitsch 19 | - anubhav756 20 | - dishaprakash 21 | - twishabansal 22 | assign_issues_by: 23 | - labels: 24 | - 'product: bigquery' 25 | to: 26 | - Genesis929 27 | - shobsi 28 | - jiaxunwu 29 | - labels: 30 | - 'product: looker' 31 | to: 32 | - drstrangelooker 33 | assign_prs: 34 | - Yuan325 35 | - duwenxin99 36 | - averikitsch 37 | ``` -------------------------------------------------------------------------------- /.github/workflows/schedule_reporter.yml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2025 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | name: Schedule Reporter 16 | 17 | on: 18 | schedule: 19 | - cron: '0 6 * * *' # Runs at 6 AM every morning 20 | 21 | jobs: 22 | run_reporter: 23 | permissions: 24 | issues: 'write' 25 | checks: 'read' 26 | contents: 'read' 27 | uses: ./.github/workflows/cloud_build_failure_reporter.yml 28 | with: 29 | trigger_names: "toolbox-test-nightly,toolbox-test-on-merge,toolbox-continuous-release" 30 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudsql/cloudsqlgetinstances.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "cloud-sql-get-instance" 3 | type: docs 4 | weight: 10 5 | description: > 6 | Get a Cloud SQL instance resource. 7 | --- 8 | 9 | The `cloud-sql-get-instance` tool retrieves a Cloud SQL instance resource using 10 | the Cloud SQL Admin API. 11 | 12 | {{< notice info >}} 13 | This tool uses a `source` of kind `cloud-sql-admin`. 14 | {{< /notice >}} 15 | 16 | ## Example 17 | 18 | ```yaml 19 | tools: 20 | get-sql-instance: 21 | kind: cloud-sql-get-instance 22 | source: my-cloud-sql-admin-source 23 | description: "Gets a particular cloud sql instance." 24 | ``` 25 | 26 | ## Reference 27 | 28 | | **field** | **type** | **required** | **description** | 29 | | ----------- | :------: | :----------: | ------------------------------------------------ | 30 | | kind | string | true | Must be "cloud-sql-get-instance". | 31 | | source | string | true | The name of the `cloud-sql-admin` source to use. | 32 | | description | string | false | A description of the tool. | 33 | ``` -------------------------------------------------------------------------------- /docs/en/resources/sources/_index.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "Sources" 3 | type: docs 4 | weight: 1 5 | description: > 6 | Sources represent your different data sources that a tool can interact with. 7 | --- 8 | 9 | A Source represents a data sources that a tool can interact with. You can define 10 | Sources as a map in the `sources` section of your `tools.yaml` file. Typically, 11 | a source configuration will contain any information needed to connect with and 12 | interact with the database. 13 | 14 | {{< notice tip >}} 15 | Use environment variable replacement with the format ${ENV_NAME} 16 | instead of hardcoding your secrets into the configuration file. 17 | {{< /notice >}} 18 | 19 | ```yaml 20 | sources: 21 | my-cloud-sql-source: 22 | kind: cloud-sql-postgres 23 | project: my-project-id 24 | region: us-central1 25 | instance: my-instance-name 26 | database: my_db 27 | user: ${USER_NAME} 28 | password: ${PASSWORD} 29 | ``` 30 | 31 | In implementation, each source is a different connection pool or client that used 32 | to connect to the database and execute the tool. 33 | 34 | ## Available Sources 35 | ``` -------------------------------------------------------------------------------- /internal/server/mcp/jsonrpc/jsonrpc_test.go: -------------------------------------------------------------------------------- ```go 1 | // Copyright 2025 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | package jsonrpc 16 | 17 | import ( 18 | "reflect" 19 | "testing" 20 | ) 21 | 22 | func TestNewError(t *testing.T) { 23 | var id interface{} = "foo" 24 | code := 111 25 | message := "foo bar" 26 | want := JSONRPCError{ 27 | Jsonrpc: "2.0", 28 | Id: "foo", 29 | Error: Error{ 30 | Code: 111, 31 | Message: "foo bar", 32 | }, 33 | } 34 | 35 | got := NewError(id, code, message, nil) 36 | if !reflect.DeepEqual(want, got) { 37 | t.Fatalf("unexpected error: got %+v, want %+v", got, want) 38 | } 39 | } 40 | ``` -------------------------------------------------------------------------------- /internal/auth/auth.go: -------------------------------------------------------------------------------- ```go 1 | // Copyright 2024 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | package auth 16 | 17 | import ( 18 | "context" 19 | "net/http" 20 | ) 21 | 22 | // AuthServiceConfig is the interface for configuring authentication services. 23 | type AuthServiceConfig interface { 24 | AuthServiceConfigKind() string 25 | Initialize() (AuthService, error) 26 | } 27 | 28 | // AuthService is the interface for authentication services. 29 | type AuthService interface { 30 | AuthServiceKind() string 31 | GetName() string 32 | GetClaimsFromHeader(context.Context, http.Header) (map[string]any, error) 33 | } 34 | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/neo4j.yaml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2025 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | sources: 16 | neo4j-source: 17 | kind: neo4j 18 | uri: ${NEO4J_URI} 19 | database: ${NEO4J_DATABASE} 20 | user: ${NEO4J_USERNAME} 21 | password: ${NEO4J_PASSWORD} 22 | 23 | tools: 24 | execute_cypher: 25 | kind: neo4j-execute-cypher 26 | source: neo4j-source 27 | description: Use this tool to execute Cypher queries. 28 | 29 | get_schema: 30 | kind: neo4j-schema 31 | source: neo4j-source 32 | description: Use this tool to get the database schema. 33 | 34 | toolsets: 35 | neo4j_database_tools: 36 | - execute_cypher 37 | - get_schema 38 | ``` -------------------------------------------------------------------------------- /docs/en/resources/sources/mongodb.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "MongoDB" 3 | type: docs 4 | weight: 1 5 | description: > 6 | 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. 7 | 8 | --- 9 | 10 | ## About 11 | 12 | [MongoDB][mongodb-docs] is a popular NoSQL database that stores data in 13 | flexible, JSON-like documents, making it easy to develop and scale applications. 14 | 15 | [mongodb-docs]: https://www.mongodb.com/docs/atlas/getting-started/ 16 | 17 | ## Example 18 | 19 | ```yaml 20 | sources: 21 | my-mongodb: 22 | kind: mongodb 23 | uri: "mongodb+srv://username:[email protected]" 24 | 25 | ``` 26 | 27 | ## Reference 28 | 29 | | **field** | **type** | **required** | **description** | 30 | |-----------|:--------:|:------------:|-------------------------------------------------------------------| 31 | | kind | string | true | Must be "mongodb". | 32 | | uri | string | true | connection string to connect to MongoDB | 33 | ``` -------------------------------------------------------------------------------- /.github/workflows/sync-labels.yaml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2024 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | name: Sync Labels 16 | on: 17 | push: 18 | branches: 19 | - main 20 | 21 | # Declare default permissions as read only. 22 | permissions: read-all 23 | 24 | jobs: 25 | build: 26 | runs-on: ubuntu-latest 27 | permissions: 28 | contents: 'read' 29 | issues: 'write' 30 | pull-requests: 'write' 31 | steps: 32 | - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 33 | - uses: micnncim/action-label-syncer@3abd5ab72fda571e69fffd97bd4e0033dd5f495c # v1.3.0 34 | env: 35 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 36 | with: 37 | manifest: .github/labels.yaml 38 | ``` -------------------------------------------------------------------------------- /internal/sources/ip_type.go: -------------------------------------------------------------------------------- ```go 1 | // Copyright 2024 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | package sources 16 | 17 | import ( 18 | "context" 19 | "fmt" 20 | "strings" 21 | ) 22 | 23 | type IPType string 24 | 25 | func (i *IPType) String() string { 26 | if string(*i) != "" { 27 | return strings.ToLower(string(*i)) 28 | } 29 | return "public" 30 | } 31 | 32 | func (i *IPType) UnmarshalYAML(ctx context.Context, unmarshal func(interface{}) error) error { 33 | var ipType string 34 | if err := unmarshal(&ipType); err != nil { 35 | return err 36 | } 37 | switch strings.ToLower(ipType) { 38 | case "private", "public", "psc": 39 | *i = IPType(strings.ToLower(ipType)) 40 | return nil 41 | default: 42 | return fmt.Errorf(`ipType invalid: must be one of "public", "private", or "psc"`) 43 | } 44 | } 45 | ``` -------------------------------------------------------------------------------- /internal/server/static/tools.html: -------------------------------------------------------------------------------- ```html 1 | <!DOCTYPE html> 2 | <html lang="en"> 3 | <head> 4 | <meta charset="UTF-8"> 5 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 | <title>Tools View</title> 7 | <link rel="stylesheet" href="/ui/css/style.css"> 8 | <script src="https://accounts.google.com/gsi/client" async defer></script> 9 | </head> 10 | <body> 11 | <div id="navbar-container" data-active-nav="/ui/tools"></div> 12 | 13 | <aside class="second-nav"> 14 | <h4>My Tools</h4> 15 | <div id="secondary-panel-content"> 16 | <p>Fetching tools...</p> 17 | </div> 18 | </aside> 19 | 20 | <div id="main-content-container"></div> 21 | 22 | <script type="module" src="/ui/js/tools.js"></script> 23 | <script src="/ui/js/navbar.js"></script> 24 | <script src="/ui/js/mainContent.js"></script> 25 | <script> 26 | document.addEventListener('DOMContentLoaded', () => { 27 | const navbarContainer = document.getElementById('navbar-container'); 28 | const activeNav = navbarContainer.getAttribute('data-active-nav'); 29 | renderNavbar('navbar-container', activeNav); 30 | renderMainContent('main-content-container', 'tool-display-area', getToolInstructions()) 31 | }); 32 | </script> 33 | </body> 34 | </html> ``` -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- ```dockerfile 1 | # Copyright 2024 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | # Use the latest stable golang 1.x to compile to a binary 16 | FROM --platform=$BUILDPLATFORM golang:1 AS build 17 | 18 | WORKDIR /go/src/genai-toolbox 19 | COPY . . 20 | 21 | ARG TARGETOS 22 | ARG TARGETARCH 23 | ARG BUILD_TYPE="container.dev" 24 | ARG COMMIT_SHA="" 25 | 26 | RUN go get ./... 27 | RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \ 28 | go build -ldflags "-X github.com/googleapis/genai-toolbox/cmd.buildType=${BUILD_TYPE} -X github.com/googleapis/genai-toolbox/cmd.commitSha=${COMMIT_SHA}" 29 | 30 | # Final Stage 31 | FROM gcr.io/distroless/static:nonroot 32 | 33 | WORKDIR /app 34 | COPY --from=build --chown=nonroot /go/src/genai-toolbox/genai-toolbox /toolbox 35 | USER nonroot 36 | 37 | ENTRYPOINT ["/toolbox"] 38 | ``` -------------------------------------------------------------------------------- /internal/log/logger.go: -------------------------------------------------------------------------------- ```go 1 | // Copyright 2024 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | package log 16 | 17 | import ( 18 | "context" 19 | ) 20 | 21 | // Logger is the interface used throughout the project for logging. 22 | type Logger interface { 23 | // DebugContext is for reporting additional information about internal operations. 24 | DebugContext(ctx context.Context, format string, args ...interface{}) 25 | // InfoContext is for reporting informational messages. 26 | InfoContext(ctx context.Context, format string, args ...interface{}) 27 | // WarnContext is for reporting warning messages. 28 | WarnContext(ctx context.Context, format string, args ...interface{}) 29 | // ErrorContext is for reporting errors. 30 | ErrorContext(ctx context.Context, format string, args ...interface{}) 31 | } 32 | ``` -------------------------------------------------------------------------------- /internal/sources/dialect.go: -------------------------------------------------------------------------------- ```go 1 | // Copyright 2024 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | package sources 16 | 17 | import ( 18 | "context" 19 | "fmt" 20 | "strings" 21 | ) 22 | 23 | // Dialect represents the dialect type of a database. 24 | type Dialect string 25 | 26 | func (i *Dialect) String() string { 27 | if string(*i) != "" { 28 | return strings.ToLower(string(*i)) 29 | } 30 | return "googlesql" 31 | } 32 | 33 | func (i *Dialect) UnmarshalYAML(ctx context.Context, unmarshal func(interface{}) error) error { 34 | var dialect string 35 | if err := unmarshal(&dialect); err != nil { 36 | return err 37 | } 38 | switch strings.ToLower(dialect) { 39 | case "googlesql", "postgresql": 40 | *i = Dialect(strings.ToLower(dialect)) 41 | return nil 42 | default: 43 | return fmt.Errorf(`dialect invalid: must be one of "googlesql", or "postgresql"`) 44 | } 45 | } 46 | ``` -------------------------------------------------------------------------------- /internal/server/static/js/tools.js: -------------------------------------------------------------------------------- ```javascript 1 | // Copyright 2025 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | import { loadTools } from "./loadTools.js"; 16 | 17 | /** 18 | * These functions runs after the browser finishes loading and parsing HTML structure. 19 | * This ensures that elements can be safely accessed. 20 | */ 21 | document.addEventListener('DOMContentLoaded', () => { 22 | const toolDisplayArea = document.getElementById('tool-display-area'); 23 | const secondaryPanelContent = document.getElementById('secondary-panel-content'); 24 | const DEFAULT_TOOLSET = ""; // will return all toolsets 25 | 26 | if (!secondaryPanelContent || !toolDisplayArea) { 27 | console.error('Required DOM elements not found.'); 28 | return; 29 | } 30 | 31 | loadTools(secondaryPanelContent, toolDisplayArea, DEFAULT_TOOLSET); 32 | }); 33 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/utility/wait.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "wait" 3 | type: docs 4 | weight: 1 5 | description: > 6 | A "wait" tool pauses execution for a specified duration. 7 | aliases: 8 | - /resources/tools/utility/wait 9 | --- 10 | 11 | ## About 12 | 13 | A `wait` tool pauses execution for a specified duration. This can be useful in 14 | workflows where a delay is needed between steps. 15 | 16 | `wait` takes one input parameter `duration` which is a string representing the 17 | time to wait (e.g., "10s", "2m", "1h"). 18 | 19 | {{< notice info >}} 20 | This tool is intended for developer assistant workflows with human-in-the-loop 21 | and shouldn't be used for production agents. 22 | {{< /notice >}} 23 | 24 | ## Example 25 | 26 | ```yaml 27 | tools: 28 | wait_for_tool: 29 | kind: wait 30 | description: Use this tool to pause execution for a specified duration. 31 | timeout: 30s 32 | ``` 33 | 34 | ## Reference 35 | 36 | | **field** | **type** | **required** | **description** | 37 | |-------------|:--------------:|:------------:|-------------------------------------------------------| 38 | | kind | string | true | Must be "wait". | 39 | | description | string | true | Description of the tool that is passed to the LLM. | 40 | | timeout | string | true | The default duration the tool can wait for. | 41 | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/dataplex.yaml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2025 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | sources: 16 | dataplex-source: 17 | kind: "dataplex" 18 | project: ${DATAPLEX_PROJECT} 19 | 20 | tools: 21 | search_entries: 22 | kind: dataplex-search-entries 23 | source: dataplex-source 24 | description: Use this tool to search for entries in Dataplex Catalog based on the provided search query. 25 | lookup_entry: 26 | kind: dataplex-lookup-entry 27 | source: dataplex-source 28 | description: Use this tool to retrieve a specific entry from Dataplex Catalog. 29 | search_aspect_types: 30 | kind: dataplex-search-aspect-types 31 | source: dataplex-source 32 | description: Use this tool to find aspect types relevant to the query. 33 | 34 | toolsets: 35 | dataplex_tools: 36 | - search_entries 37 | - lookup_entry 38 | - search_aspect_types 39 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/oceanbase/oceanbase-execute-sql.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "oceanbase-execute-sql" 3 | type: docs 4 | weight: 1 5 | description: > 6 | An "oceanbase-execute-sql" tool executes a SQL statement against an OceanBase database. 7 | aliases: 8 | - /resources/tools/oceanbase-execute-sql 9 | --- 10 | 11 | ## About 12 | 13 | An `oceanbase-execute-sql` tool executes a SQL statement against an OceanBase 14 | database. It's compatible with the following source: 15 | 16 | - [oceanbase](../sources/oceanbase.md) 17 | 18 | `oceanbase-execute-sql` takes one input parameter `sql` and runs the sql 19 | statement against the `source`. 20 | 21 | > **Note:** This tool is intended for developer assistant workflows with 22 | > human-in-the-loop and shouldn't be used for production agents. 23 | 24 | ## Example 25 | 26 | ```yaml 27 | tools: 28 | execute_sql_tool: 29 | kind: oceanbase-execute-sql 30 | source: my-oceanbase-instance 31 | description: Use this tool to execute sql statement. 32 | ``` 33 | 34 | ## Reference 35 | 36 | | **field** | **type** | **required** | **description** | 37 | |-------------|:--------:|:------------:|----------------------------------------------------| 38 | | kind | string | true | Must be "oceanbase-execute-sql". | 39 | | source | string | true | Name of the source the SQL should execute on. | 40 | | description | string | true | Description of the tool that is passed to the LLM. | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firebird/firebird-execute-sql.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "firebird-execute-sql" 3 | type: docs 4 | weight: 1 5 | description: > 6 | A "firebird-execute-sql" tool executes a SQL statement against a Firebird 7 | database. 8 | aliases: 9 | - /resources/tools/firebird-execute-sql 10 | --- 11 | 12 | ## About 13 | 14 | A `firebird-execute-sql` tool executes a SQL statement against a Firebird 15 | database. It's compatible with the following source: 16 | 17 | - [firebird](../sources/firebird.md) 18 | 19 | `firebird-execute-sql` takes one input parameter `sql` and runs the sql 20 | statement against the `source`. 21 | 22 | > **Note:** This tool is intended for developer assistant workflows with 23 | > human-in-the-loop and shouldn't be used for production agents. 24 | 25 | ## Example 26 | 27 | ```yaml 28 | tools: 29 | execute_sql_tool: 30 | kind: firebird-execute-sql 31 | source: my_firebird_db 32 | description: Use this tool to execute a SQL statement against the Firebird database. 33 | ``` 34 | 35 | ## Reference 36 | 37 | | **field** | **type** | **required** | **description** | 38 | |-------------|:--------:|:------------:|----------------------------------------------------| 39 | | kind | string | true | Must be "firebird-execute-sql". | 40 | | source | string | true | Name of the source the SQL should execute on. | 41 | | description | string | true | Description of the tool that is passed to the LLM. | 42 | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/mssql.yaml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2025 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | sources: 16 | mssql-source: 17 | kind: mssql 18 | host: ${MSSQL_HOST} 19 | port: ${MSSQL_PORT} 20 | database: ${MSSQL_DATABASE} 21 | user: ${MSSQL_USER} 22 | password: ${MSSQL_PASSWORD} 23 | tools: 24 | execute_sql: 25 | kind: mssql-execute-sql 26 | source: mssql-source 27 | description: Use this tool to execute SQL. 28 | 29 | list_tables: 30 | kind: mssql-list-tables 31 | source: mssql-source 32 | 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." 33 | 34 | toolsets: 35 | mssql_database_tools: 36 | - execute_sql 37 | - list_tables 38 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/cloudsql/cloudsqlcreateusers.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: cloud-sql-create-users 3 | type: docs 4 | weight: 10 5 | description: > 6 | Create a new user in a Cloud SQL instance. 7 | --- 8 | 9 | The `cloud-sql-create-users` tool creates a new user in a specified Cloud SQL 10 | instance. It can create both built-in and IAM users. 11 | 12 | {{< notice info >}} 13 | This tool uses a `source` of kind `cloud-sql-admin`. 14 | {{< /notice >}} 15 | 16 | ## Example 17 | 18 | ```yaml 19 | tools: 20 | create-cloud-sql-user: 21 | kind: cloud-sql-create-users 22 | source: my-cloud-sql-admin-source 23 | 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" 24 | ``` 25 | 26 | ## Reference 27 | 28 | | **field** | **type** | **required** | **description** | 29 | | ------------ | :-------: | :----------: | ------------------------------------------------ | 30 | | kind | string | true | Must be "cloud-sql-create-users". | 31 | | description | string | false | A description of the tool. | 32 | | source | string | true | The name of the `cloud-sql-admin` source to use. | 33 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/sqlite/sqlite-execute-sql.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "sqlite-execute-sql" 3 | type: docs 4 | weight: 1 5 | description: > 6 | A "sqlite-execute-sql" tool executes a single SQL statement against a SQLite database. 7 | aliases: 8 | - /resources/tools/sqlite-execute-sql 9 | --- 10 | 11 | ## About 12 | 13 | A `sqlite-execute-sql` tool executes a single SQL statement against a SQLite 14 | database. It's compatible with any of the following sources: 15 | 16 | - [sqlite](../../sources/sqlite.md) 17 | 18 | This tool is designed for direct execution of SQL statements. It takes a single 19 | `sql` input parameter and runs the SQL statement against the configured SQLite 20 | `source`. 21 | 22 | > **Note:** This tool is intended for developer assistant workflows with 23 | > human-in-the-loop and shouldn't be used for production agents. 24 | 25 | ## Example 26 | 27 | ```yaml 28 | tools: 29 | execute_sql_tool: 30 | kind: sqlite-execute-sql 31 | source: my-sqlite-db 32 | description: Use this tool to execute a SQL statement. 33 | ``` 34 | 35 | ## Reference 36 | 37 | | **field** | **type** | **required** | **description** | 38 | |-------------|:--------:|:------------:|----------------------------------------------------| 39 | | kind | string | true | Must be "sqlite-execute-sql". | 40 | | source | string | true | Name of the source the SQL should execute on. | 41 | | description | string | true | Description of the tool that is passed to the LLM. | 42 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firestore/firestore-get-rules.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "firestore-get-rules" 3 | type: docs 4 | weight: 1 5 | description: > 6 | A "firestore-get-rules" tool retrieves the active Firestore security rules for the current project. 7 | aliases: 8 | - /resources/tools/firestore-get-rules 9 | --- 10 | 11 | ## About 12 | 13 | A `firestore-get-rules` tool retrieves the active [Firestore security 14 | rules](https://firebase.google.com/docs/firestore/security/get-started) for the 15 | current project. 16 | It's compatible with the following sources: 17 | 18 | - [firestore](../../sources/firestore.md) 19 | 20 | `firestore-get-rules` takes no input parameters and returns the security rules 21 | content along with metadata such as the ruleset name, and timestamps. 22 | 23 | ## Example 24 | 25 | ```yaml 26 | tools: 27 | get_firestore_rules: 28 | kind: firestore-get-rules 29 | source: my-firestore-source 30 | description: Use this tool to retrieve the active Firestore security rules. 31 | ``` 32 | 33 | ## Reference 34 | 35 | | **field** | **type** | **required** | **description** | 36 | |-------------|:-------------:|:------------:|-------------------------------------------------------| 37 | | kind | string | true | Must be "firestore-get-rules". | 38 | | source | string | true | Name of the Firestore source to retrieve rules from. | 39 | | description | string | true | Description of the tool that is passed to the LLM. | 40 | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/clickhouse.yaml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2025 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | sources: 15 | clickhouse-source: 16 | kind: clickhouse 17 | host: ${CLICKHOUSE_HOST} 18 | port: ${CLICKHOUSE_PORT} 19 | user: ${CLICKHOUSE_USER} 20 | password: ${CLICKHOUSE_PASSWORD} 21 | database: ${CLICKHOUSE_DATABASE} 22 | protocol: ${CLICKHOUSE_PROTOCOL} 23 | 24 | tools: 25 | execute_sql: 26 | kind: clickhouse-execute-sql 27 | source: clickhouse-source 28 | description: Use this tool to execute SQL. 29 | 30 | list_databases: 31 | kind: clickhouse-list-databases 32 | source: clickhouse-source 33 | description: Use this tool to list all databases in ClickHouse. 34 | 35 | list_tables: 36 | kind: clickhouse-list-tables 37 | source: clickhouse-source 38 | description: Use this tool to list all tables in a specific ClickHouse database. 39 | 40 | toolsets: 41 | clickhouse_database_tools: 42 | - execute_sql 43 | - list_databases 44 | - list_tables 45 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firestore/firestore-get-documents.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "firestore-get-documents" 3 | type: docs 4 | weight: 1 5 | description: > 6 | A "firestore-get-documents" tool retrieves multiple documents from Firestore by their paths. 7 | aliases: 8 | - /resources/tools/firestore-get-documents 9 | --- 10 | 11 | ## About 12 | 13 | A `firestore-get-documents` tool retrieves multiple documents from Firestore by 14 | their paths. 15 | It's compatible with the following sources: 16 | 17 | - [firestore](../../sources/firestore.md) 18 | 19 | `firestore-get-documents` takes one input parameter `documentPaths` which is an 20 | array of document paths, and returns the documents' data along with metadata 21 | such as existence status, creation time, update time, and read time. 22 | 23 | ## Example 24 | 25 | ```yaml 26 | tools: 27 | get_user_documents: 28 | kind: firestore-get-documents 29 | source: my-firestore-source 30 | description: Use this tool to retrieve multiple documents from Firestore. 31 | ``` 32 | 33 | ## Reference 34 | 35 | | **field** | **type** | **required** | **description** | 36 | |-------------|:--------------:|:------------:|------------------------------------------------------------| 37 | | kind | string | true | Must be "firestore-get-documents". | 38 | | source | string | true | Name of the Firestore source to retrieve documents from. | 39 | | description | string | true | Description of the tool that is passed to the LLM. | 40 | ``` -------------------------------------------------------------------------------- /tests/auth.go: -------------------------------------------------------------------------------- ```go 1 | // Copyright 2024 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | package tests 16 | 17 | import ( 18 | "context" 19 | "os" 20 | "os/exec" 21 | "strings" 22 | 23 | "google.golang.org/api/idtoken" 24 | ) 25 | 26 | var ServiceAccountEmail = os.Getenv("SERVICE_ACCOUNT_EMAIL") 27 | var ClientId = os.Getenv("CLIENT_ID") 28 | 29 | // GetGoogleIdToken retrieve and return the Google ID token 30 | func GetGoogleIdToken(audience string) (string, error) { 31 | // For local testing - use gcloud command to print personal ID token 32 | cmd := exec.Command("gcloud", "auth", "print-identity-token") 33 | output, err := cmd.Output() 34 | if err == nil { 35 | return strings.TrimSpace(string(output)), nil 36 | } 37 | // For Cloud Build testing - retrieve ID token from GCE metadata server 38 | ts, err := idtoken.NewTokenSource(context.Background(), ClientId) 39 | if err != nil { 40 | return "", err 41 | } 42 | token, err := ts.Token() 43 | if err != nil { 44 | return "", err 45 | } 46 | return token.AccessToken, nil 47 | } 48 | ``` -------------------------------------------------------------------------------- /docs/en/resources/tools/firestore/firestore-delete-documents.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "firestore-delete-documents" 3 | type: docs 4 | weight: 1 5 | description: > 6 | A "firestore-delete-documents" tool deletes multiple documents from Firestore by their paths. 7 | aliases: 8 | - /resources/tools/firestore-delete-documents 9 | --- 10 | 11 | ## About 12 | 13 | A `firestore-delete-documents` tool deletes multiple documents from Firestore by 14 | their paths. 15 | It's compatible with the following sources: 16 | 17 | - [firestore](../../sources/firestore.md) 18 | 19 | `firestore-delete-documents` takes one input parameter `documentPaths` which is 20 | an array of document paths to delete. The tool uses Firestore's BulkWriter for 21 | efficient batch deletion and returns the success status for each document. 22 | 23 | ## Example 24 | 25 | ```yaml 26 | tools: 27 | delete_user_documents: 28 | kind: firestore-delete-documents 29 | source: my-firestore-source 30 | description: Use this tool to delete multiple documents from Firestore. 31 | ``` 32 | 33 | ## Reference 34 | 35 | | **field** | **type** | **required** | **description** | 36 | |-------------|:--------------:|:------------:|----------------------------------------------------------| 37 | | kind | string | true | Must be "firestore-delete-documents". | 38 | | source | string | true | Name of the Firestore source to delete documents from. | 39 | | description | string | true | Description of the tool that is passed to the LLM. | 40 | ``` -------------------------------------------------------------------------------- /internal/server/web.go: -------------------------------------------------------------------------------- ```go 1 | package server 2 | 3 | import ( 4 | "bytes" 5 | "embed" 6 | "fmt" 7 | "io" 8 | "io/fs" 9 | "net/http" 10 | 11 | "github.com/go-chi/chi/v5" 12 | "github.com/go-chi/chi/v5/middleware" 13 | ) 14 | 15 | //go:embed all:static 16 | var staticContent embed.FS 17 | 18 | // webRouter creates a router that represents the routes under /ui 19 | func webRouter() (chi.Router, error) { 20 | r := chi.NewRouter() 21 | r.Use(middleware.StripSlashes) 22 | 23 | // direct routes for html pages to provide clean URLs 24 | r.Get("/", func(w http.ResponseWriter, r *http.Request) { serveHTML(w, r, "static/index.html") }) 25 | r.Get("/tools", func(w http.ResponseWriter, r *http.Request) { serveHTML(w, r, "static/tools.html") }) 26 | r.Get("/toolsets", func(w http.ResponseWriter, r *http.Request) { serveHTML(w, r, "static/toolsets.html") }) 27 | 28 | // handler for all other static files/assets 29 | staticFS, _ := fs.Sub(staticContent, "static") 30 | r.Handle("/*", http.StripPrefix("/ui", http.FileServer(http.FS(staticFS)))) 31 | 32 | return r, nil 33 | } 34 | 35 | func serveHTML(w http.ResponseWriter, r *http.Request, filepath string) { 36 | file, err := staticContent.Open(filepath) 37 | if err != nil { 38 | http.Error(w, "File not found", http.StatusNotFound) 39 | return 40 | } 41 | defer file.Close() 42 | 43 | fileBytes, err := io.ReadAll(file) 44 | if err != nil { 45 | http.Error(w, fmt.Sprintf("Error reading file: %v", err), http.StatusInternalServerError) 46 | return 47 | } 48 | 49 | fileInfo, err := file.Stat() 50 | if err != nil { 51 | return 52 | } 53 | http.ServeContent(w, r, fileInfo.Name(), fileInfo.ModTime(), bytes.NewReader(fileBytes)) 54 | } 55 | ``` -------------------------------------------------------------------------------- /internal/tools/mysql/mysqlcommon/mysqlcommon.go: -------------------------------------------------------------------------------- ```go 1 | // Copyright 2025 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | package mysqlcommon 16 | 17 | import ( 18 | "database/sql" 19 | "encoding/json" 20 | "reflect" 21 | ) 22 | 23 | // ConvertToType handles casting mysql returns to the right type 24 | // types for mysql driver: https://github.com/go-sql-driver/mysql/blob/v1.9.3/fields.go 25 | // all numeric type or unknown type will be return as is. 26 | func ConvertToType(t *sql.ColumnType, v any) (any, error) { 27 | switch t.ScanType() { 28 | case reflect.TypeOf(""), reflect.TypeOf([]byte{}), reflect.TypeOf(sql.NullString{}): 29 | // unmarshal JSON data before returning to prevent double marshaling 30 | if t.DatabaseTypeName() == "JSON" { 31 | // unmarshal JSON data before storing to prevent double marshaling 32 | var unmarshaledData any 33 | err := json.Unmarshal(v.([]byte), &unmarshaledData) 34 | if err != nil { 35 | return nil, err 36 | } 37 | return unmarshaledData, nil 38 | } 39 | return string(v.([]byte)), nil 40 | default: 41 | return v, nil 42 | } 43 | } 44 | ``` -------------------------------------------------------------------------------- /.hugo/layouts/shortcodes/regionInclude.html: -------------------------------------------------------------------------------- ```html 1 | {{/* 2 | snippet.html 3 | Usage: 4 | {{< regionInclude "filename.md" "region_name" >}} 5 | {{< regionInclude "filename.python" "region_name" "python" >}} 6 | */}} 7 | 8 | {{ $file := .Get 0 }} 9 | {{ $region := .Get 1 }} 10 | {{ $lang := .Get 2 | default "text" }} 11 | {{ $path := printf "%s%s" .Page.File.Dir $file }} 12 | 13 | {{ if or (not $file) (eq $file "") }} 14 | {{ errorf "The file parameter (first argument) is required and must be non-empty in %s" .Page.File.Path }} 15 | {{ end }} 16 | {{ if or (not $region) (eq $region "") }} 17 | {{ errorf "The region parameter (second argument) is required and must be non-empty in %s" .Page.File.Path }} 18 | {{ end }} 19 | {{ if not (fileExists $path) }} 20 | {{ errorf "File %q not found (referenced in %s)" $path .Page.File.Path }} 21 | {{ end }} 22 | 23 | {{ $content := readFile $path }} 24 | {{ $start_tag := printf "[START %s]" $region }} 25 | {{ $end_tag := printf "[END %s]" $region }} 26 | 27 | {{ $snippet := "" }} 28 | {{ $in_snippet := false }} 29 | {{ range split $content "\n" }} 30 | {{ if $in_snippet }} 31 | {{ if in . $end_tag }} 32 | {{ $in_snippet = false }} 33 | {{ else }} 34 | {{ $snippet = printf "%s%s\n" $snippet . }} 35 | {{ end }} 36 | {{ else if in . $start_tag }} 37 | {{ $in_snippet = true }} 38 | {{ end }} 39 | {{ end }} 40 | 41 | {{ if eq (trim $snippet "") "" }} 42 | {{ errorf "Region %q not found or empty in file %s (referenced in %s)" $region $file .Page.File.Path }} 43 | {{ end }} 44 | 45 | {{ if eq $lang "text" }} 46 | {{ $snippet | markdownify }} 47 | {{ else }} 48 | {{ highlight (trim $snippet "\n") $lang "" }} 49 | {{ end }} 50 | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/cloud-sql-mssql-admin.yaml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2025 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | sources: 16 | cloud-sql-admin-source: 17 | kind: cloud-sql-admin 18 | 19 | tools: 20 | create_instance: 21 | kind: cloud-sql-mssql-create-instance 22 | source: cloud-sql-admin-source 23 | get_instance: 24 | kind: cloud-sql-get-instance 25 | source: cloud-sql-admin-source 26 | list_instances: 27 | kind: cloud-sql-list-instances 28 | source: cloud-sql-admin-source 29 | create_database: 30 | kind: cloud-sql-create-database 31 | source: cloud-sql-admin-source 32 | list_databases: 33 | kind: cloud-sql-list-databases 34 | source: cloud-sql-admin-source 35 | create_user: 36 | kind: cloud-sql-create-users 37 | source: cloud-sql-admin-source 38 | wait_for_operation: 39 | kind: cloud-sql-wait-for-operation 40 | source: cloud-sql-admin-source 41 | 42 | toolsets: 43 | cloud_sql_mssql_admin_tools: 44 | - create_instance 45 | - get_instance 46 | - list_instances 47 | - create_database 48 | - list_databases 49 | - create_user 50 | - wait_for_operation 51 | ``` -------------------------------------------------------------------------------- /internal/prebuiltconfigs/tools/cloud-sql-mysql-admin.yaml: -------------------------------------------------------------------------------- ```yaml 1 | # Copyright 2025 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | sources: 16 | cloud-sql-admin-source: 17 | kind: cloud-sql-admin 18 | 19 | tools: 20 | create_instance: 21 | kind: cloud-sql-mysql-create-instance 22 | source: cloud-sql-admin-source 23 | get_instance: 24 | kind: cloud-sql-get-instance 25 | source: cloud-sql-admin-source 26 | list_instances: 27 | kind: cloud-sql-list-instances 28 | source: cloud-sql-admin-source 29 | create_database: 30 | kind: cloud-sql-create-database 31 | source: cloud-sql-admin-source 32 | list_databases: 33 | kind: cloud-sql-list-databases 34 | source: cloud-sql-admin-source 35 | create_user: 36 | kind: cloud-sql-create-users 37 | source: cloud-sql-admin-source 38 | wait_for_operation: 39 | kind: cloud-sql-wait-for-operation 40 | source: cloud-sql-admin-source 41 | 42 | toolsets: 43 | cloud_sql_mysql_admin_tools: 44 | - create_instance 45 | - get_instance 46 | - list_instances 47 | - create_database 48 | - list_databases 49 | - create_user 50 | - wait_for_operation 51 | ```