Commit Graph

80 Commits

Author SHA1 Message Date
Wenxin Du
be85b82078 feat: add IAM AuthN to Cloud SQL Sources (#414)
Add IAM support for Cloud SQL source connection using Go language
connector:
https://pkg.go.dev/cloud.google.com/go/cloudsqlconn#section-readme
2025-04-08 16:26:00 -04:00
Wenxin Du
e8ed447d91 feat: Add IAM authentication to AlloyDB Source (#399)
Add IAM support for AlloyDB source connection:
https://pkg.go.dev/cloud.google.com/go/alloydbconn#section-readme
2025-04-08 13:02:44 -04:00
Yuan
75d2296d7a chore: add debug logs (#409)
Add debug logs to API and MCP server.

Example of debug logs added:
```
2025-04-07T11:12:04.62309-07:00 DEBUG "tool name: list_flights_by_arrival_airport"
2025-04-07T11:12:04.623264-07:00 DEBUG "tool invocation authorized"
2025-04-07T11:12:04.623717-07:00 DEBUG "invocation params: [{departure_airport SFO} {date 2025-04-07}]"
```
2025-04-07 12:27:31 -07:00
Yuan
b81feb61e6 fix: run linter (#410) 2025-04-07 11:18:04 -07:00
totoleon
f02885fd4a feat: add 'alloydb-ai-nl' tool (#358)
Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
Co-authored-by: Yuan <45984206+Yuan325@users.noreply.github.com>
2025-04-04 11:30:58 -07:00
Yuan
a7d1d4eb2a feat: adding support for Model Context Protocol (MCP). (#396)
Adding Toolbox support for MCP. Toolbox can now be run as an MCP server.

Fixes #312.

---------

Co-authored-by: Jack Wotherspoon <jackwoth@google.com>
Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
2025-04-04 18:24:34 +00:00
Wenxin Du
cfffe83936 docs: fix misc typos (#364)
fix some typos and formats in code & docs
`neo4jrc` should be `neo4jsrc`
2025-04-04 12:21:24 -04:00
Wenxin Du
64da5b4efe feat: Add HTTP Source and Tool (#332)
Add Source and Tool for tool invocation through HTTP requests.
2025-04-02 14:52:35 -04:00
Yuan
4e304569df refactor(server): move common tests functions into a separate file (#350)
move common tests functions in server into a separate file.
2025-03-26 10:20:30 -07:00
Yuan
ecd7c35ca1 chore: cleanup unused function (#335)
This PR is to remove the `NewGenericTool` function within tools. 

This function was previously added when we are trying to consolidate the
three postgres tools. However, since we merged it into a single
`postgressql` tool, these functions are not used anymore.
2025-03-18 14:10:47 -07:00
Yuan
2b6bb99daa chore: throw an error fail to retrieve user agent (#304)
User agent will be set as "genai-toolbox/" + versionString.

Instead of a panic, Toolbox will throw an error if the source fail to
retrieve `user agent`.

This will also be consistent with setting and getting logger from
context.
2025-03-11 13:46:44 -07:00
Anubhav Dhawan
1bdd331ead chore: update "Hello, World!" message from the default route of Toolbox. (#315) 2025-03-04 22:59:06 +05:30
Yuan
e73fbfeb3d chore(telemetry): update root trace to use context from root (#311)
Update root trace to use context from `cmd/root` instead of creating a
new context.
2025-03-03 17:05:34 +00:00
Yuan
04cb5fbc3e feat!: deprecate authsource in favor of authservice (#297)
Rename existing `authSource` to `authService` through deprecation.
`AuthService` more clearly distinguishes it from `Sources` objects.

`authSources` will be converted into `authServices` after the
unmarshalling process. A warning log is shown if `authSources` are used
(for both within tools parameters and defining auth services):
```
2025-02-20T13:57:51.156025-08:00 WARN "`authSources` is deprecated, use `authServices` for parameters instead"
2025-02-20T13:57:51.156569-08:00 WARN "`authSources` is deprecated, use `authServices` instead"
2025-02-20T13:57:52.047584-08:00 INFO "Initialized 1 sources."
...
```

The manifest generated will continue to use `authSources` to keep
compatibility with the sdks:
```
{
"serverVersion":"0.1.0",
"tools":{
  "test_tool2":{
    "description":"Use this tool to test\n",
    "parameters":[{
      "name":"user_id",
      "type":"string",
      "description":"Auto-populated from Google login",
      "authSources":["my-google-auth"]
      }]
    }
  }
}
```



Test cases with `authSources` are kept for compatibility. Will be
removed when `authSources` are no longer supported.
2025-02-21 18:36:04 -08:00
Yuan
df28036b84 chore: add and retrieves logger from context (#301)
Add functionality to add and retrieve logger from Go context.
2025-02-21 21:28:40 +00:00
Yuan
95d29f9e8a chore: pass logger via context through unmarshaller (#300)
Passing logger via context. With this, we will be able to add logs
during the unmarshaling process.
2025-02-21 13:02:23 -08:00
Yuan
9e2f49e129 chore: migrate remaining yaml library to goccy/go-yaml (#299)
Migrate yaml library from
[gopkg.in/yaml.v3](https://pkg.go.dev/gopkg.in/yaml.v3) to
[goccy/go-yaml](https://github.com/goccy/go-yaml).

It was previously migrated in
https://github.com/googleapis/genai-toolbox/pull/211. These files were
added later hence the migration wasn't done on these files.
2025-02-21 12:54:42 -08:00
Yuan
e494d11e6e fix: validate required common fields for parameters (#298)
Check common parameters for required fields. Throw an error if name or
description is not provided.

Example of error when `description` field not provided:
```
2025-02-18T14:11:55.475101-08:00 ERROR "unable to parse tool file at \"tools.yaml\": unable to parse as \"postgres-sql\": unable to parse as \"array\": Key: 'CommonParameter.Desc' Error:Field validation for 'Desc' failed on the 'required' tag"
```
2025-02-19 10:09:57 -08:00
Yuan
9193836eff fix: throw error when items field is missing from array parameter (#296)
Fixes #291 by throwing a more descriptive error when items field is not provided.

Example of error when `items` field not provided for array parameter:
```
2025-02-18T14:07:58.77173-08:00 ERROR "unable to parse tool file at \"tools.yaml\": unable to parse as \"postgres-sql\": unable to parse as \"array\": unable to parse 'items' field: error parsing parameters: nothing to unmarshal"
```
2025-02-18 19:52:36 -07:00
Yuan
541612d72d fix: add items to parameter manifest (#293)
`items` are not specified in the manifest for parameters, which means
the client doesn't parse them correctly when presented to the LLMs. This
PR adds `items` as part of manifest.

Example manifest:
```
{
    "serverVersion": "0.1.0",
    "tools": {
        "tool_name": {
            "description": "description of the tool...",
            "parameters": [{
                "name": "foos",
                "type": "array",
                "description": "A list of foo.",
                "authSources": [],
                "items": {"name": "foo", "type": "string", "description": "foobar.", "authSources": []}
            }]
        }
    }
}
```

Fixes #292 🦕
2025-02-14 15:29:16 -08:00
Yuan
ad58cd5855 fix: update tool invoke to return json (#266)
Return actual rows as `[]any` that contains `map` of results. Each `map`
represent a row, with the key being column name.
2025-02-05 13:45:01 -08:00
Yuan
b7c5661215 fix: typos at test cases (#265)
Fix port and host typo at test cases
2025-02-04 22:54:36 +00:00
Yuan
a0ac5334d1 chore: return error for untested fields in tools.yaml (#239)
This only checks within `SourceConfig`, `ToolConfig`, and
`AuthSourceConfig`.

Error when an unknown field is provided:
`2025-01-27T22:43:46.988401-08:00 ERROR "unable to parse tool file at
\"tools.yaml\": unable to parse as \"cloud-sql-postgres\": [2:1] unknown
field \"extra\"\n 1 | database: test_database\n> 2 | extra: here\n ^\n 3
| instance: toolbox-cloudsql\n 4 | kind: cloud-sql-postgres\n 5 |
password: postgres\n 6 | "`

Error when a required field is not provided:
`2025-01-27T17:49:47.584846-08:00 ERROR "unable to parse tool file at
\"tools.yaml\": validation failed: Key: 'Config.Region' Error:Field
validation for 'Region' failed on the 'required' tag"`

---------

Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
2025-02-03 15:30:27 -08:00
Shivaji Kharse
617cc872d1 feat: add dgraph tool and source (#233)
* add dgraph tool and source
2025-02-01 15:32:06 -07:00
Yuan
8fca0a95ee feat(sqlserver): add mssql source (#255)
Add `mssql` source for non-cloud sql server.
2025-01-31 19:13:54 +00:00
Yuan
378692ab50 feat(mysql): add source (#250)
Add `mysql` source.
2025-01-31 10:48:05 -08:00
Yuan
8452f8eb44 feat: add user agent to cloud databases (#244)
Add user agent to cloud databases that provides us anonymized data
request count, number of users, number of projects, and other
environment settings.

User agent is using the format: `genai-toolbox/$version+metadata`
2025-01-29 17:19:52 -08:00
Yuan
8152a98b7a ci(cloudsqlmysql): add integration tests (#243)
Add integration test for CloudSQL for MySQL.

Added other integration tests' tag into `.golangci.yaml`, and fixing
lint errors.

Moved getCloudSQLDialOpts to `common_test.go` since it is used across
all three cloud sql integration tests.
2025-01-29 17:03:40 -08:00
Yuan
1357be2569 fix(mssql): fix mssql tool kind to mssql-sql (#249)
Fixing `mssql` tool to `mssql-sql`.
2025-01-29 23:46:01 +00:00
Yuan
669d6b7239 fix(mysql): fix mysql tool kind to mysql-sql (#248)
Update `mysql` tool to `mysql-sql`.
2025-01-29 23:09:13 +00:00
Wenxin Du
4639cc6560 fix: Auth token verification failure should not throw error immedicately (#234)
Currently, we are throwing 401 error immediately after auth token
verification failure. This is not expected in the following situations:
1. Non-auth tool invocation with auth token that is invalid.
2. Auth tool invocation with all the required auth token, but the header
contains extra non-required token that is invalid
These requests should pass the authorization check but fail under the
current implementation.

Change made in this PR:
1. Do not throw error immediately after auth token verification failure.
Instead only log it and continue to the next header iteration.
2. In the parseParams() method, if an auth parameter is missing, we
should error with the message telling the user that either the auth
header is missing or is invalid.
2025-01-24 08:49:51 -07:00
Wenxin Du
9bad952060 feat: Add Cloud SQL for SQL Server Source and Tool (#223)
1. `sql/database` provides a `Scan()`interface to scan query results
into typed variables. Therefore we have to create a slice of typed
variables (types retrieved from rows.ColumnTypes()) to pass them into
`Scan()`. Using []byte works but makes the printing result different
from other tools (e.g [1] instead of %!s(int32=1)]
2. MS SQL supports both named (e.g @name) and positional args (e.g @p2),
so we have to check if the name is contained in the original statement
before passing them into `db.Query()` as either named arg or as values.
2025-01-23 21:21:12 +08:00
Yuan
f1f61d7087 feat: add cloudsql mysql source and tool (#221)
Add CloudSQL for MySQL source and tool.

CloudSQLMySQL source is initialize with the following config:
```
sources:
    my-cloudsqlmysql-source:
        kind: cloud-sql-mysql
        project: my-project-name
        region: my-region
        instance: my-instance-name
        user: my_user
        password: my_pass
        database: my_db
        # ipType: public # The default dialect is public.
```

MySQL tool is initialize with the following config.
```
tools:
    test_tool:
        kind: mysql
        source: my-cloudsqlmysql-source
        description: >
            Testing tool.
        statement: "SELECT 1;"
```
2025-01-21 13:53:37 +00:00
Yuan
45fc046437 chore: migrate yaml library to goccy/go-yaml (#211)
Migrate yaml library from
[gopkg.in/yaml.v3](https://pkg.go.dev/gopkg.in/yaml.v3) to
[goccy/go-yaml](https://github.com/goccy/go-yaml).

We are trying to add validation feature to the unmarshaling of yaml.
However, `yaml.v3` currently does not support that and the library had
not been actively maintained for awhile. This migration will allow us to
use validation processing such as
[go-playground/validator](https://github.com/go-playground/validator)

---------

Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
2025-01-16 09:15:18 -08:00
Yuan
0c3d12ae04 fix: fix typo in postgres test (#216) 2025-01-15 17:53:04 +00:00
Yuan
346c57da23 fix: improve return error for parameters (#206) 2025-01-14 16:35:33 +00:00
Michael Hunger
8a1224b9e0 feat: Added Neo4j Source and Tool (#189)
- configure neo4j source with url, username, password, database
- configure neo4j tools with cypher statement and paramters
- tests based on the postgres tests
- neo4j.yaml for integration tests
---------

Co-authored-by: duwenxin <duwenxin@google.com>
2025-01-14 09:17:18 -07:00
Wenxin Du
e069520bb7 feat!: replace Source field ip_type with ipType for consistency (#197)
Replace `ip_type` with `ipType` to match the camel-case of the other
fields.
Update docs since we support both private and public IP connections.
2025-01-14 10:56:06 +08:00
Yuan
1fcc20a846 feat: add support for OpenTelemetry (#205)
Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2025-01-13 15:38:38 -08:00
Yuan
d8ffbc68ee ci(spanner): add integration tests (#188) 2025-01-12 21:56:14 -08:00
Yuan
d65cefc600 chore: Add debug logs (#195)
Add debug logs to Toolbox. 

For example when a http fail, it will just show Error at the http level,
but not log with actual error message. err message are returned to the
api as following `{"status":"Internal Server Error","error":"error while
invoking tool: unable to execute client: spanner: code =
\"InvalidArgument\", desc = \"invalid session pool\""}`.

After adding this, if user/dev run toolbox with `--log-level=debug`, it
will output the following (debug log in addition to the error for http
request):

```
2025-01-08T14:16:25.040824-08:00 DEBUG "error while invoking tool: unable to execute client: spanner: code = \"InvalidArgument\", desc = \"invalid session pool\""

2025-01-08T14:16:25.040968-08:00 ERROR Response: 500 Server Error service: "httplog" httpRequest: {url: "http://127.0.0.1:5000/api/tool/test_tool_two/invoke" method: "POST" path: "/api/tool/test_tool_two/invoke" remoteIP: "127.0.0.1:51708" proto: "HTTP/1.1" requestID: "yuanteoh-macbookpro.roam.internal/N7LNMcLIUH-000001" scheme: "http" header: {user-agent: "curl/8.7.1" accept: "*/*" content-type: "application/json" content-length: "2"}} httpResponse: {status: 500 bytes: 167 elapsed: 0.301917}
```
2025-01-13 05:47:46 +00:00
Kurtis Van Gent
387a5b56b5 fix: correct parsing of floats/ints from json (#180)
Corrects an issue caused by Go defaulting to parsing JSON Numbers as
float64s. This caused some numbers to be incorrectly parsed as floats
when they were integers. This defaults to parsing using json.Number,
which allows us to parse between Int/Float more accurately.
2025-01-03 10:09:45 -07:00
Kurtis Van Gent
66ab70f702 fix: handle shutdown gracefully (#178)
Adds logic to make the server shutdown gracefully, including better
respecting cancelled contexts and providing up to 10 seconds to finish
current connections.
2024-12-31 09:53:53 -07:00
Yuan
809e547a48 feat: update log with given context (#147)
Update logging with the given context.
2024-12-23 19:55:25 -08:00
Twisha Bansal
938f7b41d7 chore: fix comments (#163) 2024-12-23 09:28:14 -07:00
Wenxin Du
3118104ae1 feat: add auth_required to tools (#123)
Check if a tool invocation request contains required auth token.
2024-12-16 22:41:13 -05:00
Wenxin Du
380a6fbbd5 feat: Add Tool authenticated parameters (#80)
1. Add []ParamAuthSource to every Parameter type implementation to
support authenticated configs. Create new constructors for types with
auth.
2. Tool invocation API changes to parse auth header and authentecated
parameters.
3. Add authSources to Tool manifest.
2024-12-16 17:46:06 -05:00
Wenxin Du
77b0d43175 feat: Add Auth Source configuration (#71)
1. Add authentication source configs to Toolbox server.
2. Add Google auth implementation.
2024-12-13 12:22:42 -05:00
Yuan
7e8d751d3f ci(cloudsql-pg): add end to end integration test (#113)
End to end integration test for cloudsql postgres.

Include checks for one tool's get (manifest) and post (invoke) endpoint.

Integration tests are excluded from regular unit tests.
2024-12-12 13:56:04 -08:00
Yuan
cb3357f305 fix!(spanner): use googlesql for dialect name (#129)
Google updated the official name from `google_standard_sql` to
`googlesql`.
2024-12-11 14:11:34 -08:00