Skip to content

Conversation

@nester-neo4j
Copy link
Contributor

This pull request introduces a new tool for executing arbitrary Cypher queries against a Neo4j database (neo4j-execute-cypher) and implements robust query classification functionality to distinguish between read and write operations. The changes include updates to documentation, the addition of a query classifier, and comprehensive test coverage for the classifier.

Addition of neo4j-execute-cypher tool:

  • Documentation: Added a new markdown file neo4j-execute-cypher.md that explains the tool's functionality, usage, and configuration options, including the ability to enforce read-only mode for security.
  • Import statement: Registered the new tool in the cmd/root.go file to make it available in the toolbox.

Query classification functionality:

  • Query classifier implementation: Added QueryClassifier in classifier.go, which classifies Cypher queries into read or write operations based on keywords, procedures, and subquery analysis. It supports handling edge cases like nested subqueries, multi-word keywords, and invalid syntax.
  • Test coverage: Created extensive tests in classifier_test.go to validate the classifier's behavior across various query types, including abuse cases, subqueries, and procedure calls. Tests ensure the classifier is robust and does not panic on malformed queries.

@nester-neo4j nester-neo4j requested a review from a team as a code owner July 21, 2025 23:50
@Yuan325
Copy link
Contributor

Yuan325 commented Jul 22, 2025

/gcbrun

@Yuan325 Yuan325 added the docs: deploy-preview Label to trigger Github Action docs preview. label Jul 22, 2025
@github-actions
Copy link
Contributor

Copy link
Contributor

@Yuan325 Yuan325 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @nester-neo4j Thanks for opening this PR! I left some comments here. Thank you!

@nester-neo4j
Copy link
Contributor Author

@Yuan325 I addressed all comments, please take a look when have a chance

@Yuan325 Yuan325 self-requested a review July 22, 2025 22:22
nester-neo4j and others added 5 commits July 22, 2025 18:52
@nester-neo4j
Copy link
Contributor Author

@Yuan325 I addressed all comments, please take a look when have a chance

@Yuan325 I also addressed later comments and updated docs with new param name

Copy link
Contributor

@Yuan325 Yuan325 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM with a quick nit. Thank you!

@Yuan325
Copy link
Contributor

Yuan325 commented Jul 23, 2025

/gcbrun

@Yuan325 Yuan325 added the tests: run Label to trigger Github Action tests. label Jul 23, 2025
@github-actions github-actions bot removed the tests: run Label to trigger Github Action tests. label Jul 23, 2025
@Yuan325 Yuan325 added docs: deploy-preview Label to trigger Github Action docs preview. and removed docs: deploy-preview Label to trigger Github Action docs preview. labels Jul 23, 2025
@github-actions
Copy link
Contributor

@Yuan325 Yuan325 added the tests: run Label to trigger Github Action tests. label Jul 23, 2025
@github-actions github-actions bot removed the tests: run Label to trigger Github Action tests. label Jul 23, 2025
nester-neo4j and others added 2 commits July 23, 2025 10:44
@nester-neo4j
Copy link
Contributor Author

nester-neo4j commented Jul 23, 2025

@Yuan325 Thank you for looking. I updated docs as well. Please merge when have a chance as I do not have permissions to do that

@Yuan325
Copy link
Contributor

Yuan325 commented Jul 23, 2025

/gcbrun

@Yuan325 Yuan325 added the tests: run Label to trigger Github Action tests. label Jul 23, 2025
@Yuan325 Yuan325 enabled auto-merge (squash) July 23, 2025 17:26
@github-actions github-actions bot removed the tests: run Label to trigger Github Action tests. label Jul 23, 2025
@Yuan325 Yuan325 merged commit 81d0505 into googleapis:main Jul 23, 2025
12 checks passed
github-actions bot pushed a commit that referenced this pull request Jul 23, 2025
This pull request introduces a new tool for executing arbitrary Cypher
queries against a Neo4j database (`neo4j-execute-cypher`) and implements
robust query classification functionality to distinguish between read
and write operations. The changes include updates to documentation, the
addition of a query classifier, and comprehensive test coverage for the
classifier.

### Addition of `neo4j-execute-cypher` tool:

- **Documentation**: Added a new markdown file `neo4j-execute-cypher.md`
that explains the tool's functionality, usage, and configuration
options, including the ability to enforce read-only mode for security.
- **Import statement**: Registered the new tool in the `cmd/root.go`
file to make it available in the toolbox.

### Query classification functionality:

- **Query classifier implementation**: Added `QueryClassifier` in
`classifier.go`, which classifies Cypher queries into read or write
operations based on keywords, procedures, and subquery analysis. It
supports handling edge cases like nested subqueries, multi-word
keywords, and invalid syntax.
- **Test coverage**: Created extensive tests in `classifier_test.go` to
validate the classifier's behavior across various query types, including
abuse cases, subqueries, and procedure calls. Tests ensure the
classifier is robust and does not panic on malformed queries.

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com> 81d0505
@nester-neo4j
Copy link
Contributor Author

@Yuan325 thank you very much for your help

github-actions bot pushed a commit to renovate-bot/googleapis-_-genai-toolbox that referenced this pull request Jul 23, 2025
…apis#946)

This pull request introduces a new tool for executing arbitrary Cypher
queries against a Neo4j database (`neo4j-execute-cypher`) and implements
robust query classification functionality to distinguish between read
and write operations. The changes include updates to documentation, the
addition of a query classifier, and comprehensive test coverage for the
classifier.

### Addition of `neo4j-execute-cypher` tool:

- **Documentation**: Added a new markdown file `neo4j-execute-cypher.md`
that explains the tool's functionality, usage, and configuration
options, including the ability to enforce read-only mode for security.
- **Import statement**: Registered the new tool in the `cmd/root.go`
file to make it available in the toolbox.

### Query classification functionality:

- **Query classifier implementation**: Added `QueryClassifier` in
`classifier.go`, which classifies Cypher queries into read or write
operations based on keywords, procedures, and subquery analysis. It
supports handling edge cases like nested subqueries, multi-word
keywords, and invalid syntax.
- **Test coverage**: Created extensive tests in `classifier_test.go` to
validate the classifier's behavior across various query types, including
abuse cases, subqueries, and procedure calls. Tests ensure the
classifier is robust and does not panic on malformed queries.

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com> 81d0505
Yuan325 added a commit that referenced this pull request Jul 25, 2025
🤖 I have created a release *beep* *boop*
---


##
[0.10.0](v0.9.0...v0.10.0)
(2025-07-25)


### Features

* Add `Map` parameters support
([#928](#928))
([4468bc9](4468bc9))
* Add Dataplex source and tool
([#847](#847))
([30c16a5](30c16a5))
* Add Looker source and tool
([#923](#923))
([c67e01b](c67e01b))
* Add support for null optional parameter
([#802](#802))
([a817b12](a817b12)),
closes [#736](#736)
* **prebuilt/alloydb-admin-config:** Add alloydb control plane as a
prebuilt config
([#937](#937))
([0b28b72](0b28b72))
* **prebuilt/mysql,prebuilt/mssql:** Add generic mysql and mssql
prebuilt tools
([#983](#983))
([c600c30](c600c30))
* **server/mcp:** Support MCP version 2025-06-18
([#898](#898))
([313d3ca](313d3ca))
* **sources/mssql:** Add support for encrypt connection parameter
([#874](#874))
([14a868f](14a868f))
* **sources/firestore:** Add Firestore as Source
([#786](#786))
([2bb790e](2bb790e))
* **sources/mongodb:** Add MongoDB Source
([#969](#969))
([74dbd61](74dbd61))
* **tools/alloydb-wait-for-operation:** Add wait for operation tool with
exponential backoff
([#920](#920))
([3f6ec29](3f6ec29))
* **tools/mongodb-aggregate:** Add MongoDB `aggregate` Tools
([#977](#977))
([bd399bb](bd399bb))
* **tools/mongodb-delete:** Add MongoDB `delete` Tools
([#974](#974))
([78e9752](78e9752))
* **tools/mongodb-find:** Add MongoDB `find` Tools
([#970](#970))
([a747475](a747475))
* **tools/mongodb-insert:** Add MongoDB `insert` Tools
([#975](#975))
([4c63f0c](4c63f0c))
* **tools/mongodb-update:** Add MongoDB `update` Tools
([#972](#972))
([dfde52c](dfde52c))
* **tools/neo4j-execute-cypher:** Add neo4j-execute-cypher for Neo4j
sources ([#946](#946))
([81d0505](81d0505))
* **tools/neo4j-schema:** Add neo4j-schema tool
([#978](#978))
([be7db3d](be7db3d))
* **tools/wait:** Create wait for tool
([#885](#885))
([ed5ef4c](ed5ef4c))


### Bug Fixes

* Fix document preview pipeline for forked PRs
([#950](#950))
([481cc60](481cc60))
* **prebuilt/firestore:** Mark database field as required in the
firestore prebuilt tools
([#959](#959))
([15417d4](15417d4))
* **prebuilt/cloud-sql-mssql:** Correct source reference for execute_sql
tool in cloud-sql-mssql.yaml prebuilt config
([#938](#938))
([d16728e](d16728e))
* **prebuilt/cloud-sql-mysql:** Update list_table tool
([#924](#924))
([2083ba5](2083ba5))
* Replace 'float' with 'number' in McpManifest
([#985](#985))
([59e23e1](59e23e1))
* **server/api:** Add logger to context in tool invoke handler
([#891](#891))
([8ce311f](8ce311f))
* **sources/looker:** Add agent tag to Looker API calls.
([#966](#966))
([f55dd6f](f55dd6f))
* **tools/bigquery-execute-sql:** Ensure invoke always returns a
non-null value
([#925](#925))
([9a55b80](9a55b80))
* **tools/mysqlsql:** Unmarshal json data from database during invoke
([#979](#979))
([ccc3498](ccc3498)),
closes [#840](#840)

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
github-actions bot pushed a commit that referenced this pull request Jul 25, 2025
🤖 I have created a release *beep* *boop*
---

##
[0.10.0](v0.9.0...v0.10.0)
(2025-07-25)

### Features

* Add `Map` parameters support
([#928](#928))
([4468bc9](4468bc9))
* Add Dataplex source and tool
([#847](#847))
([30c16a5](30c16a5))
* Add Looker source and tool
([#923](#923))
([c67e01b](c67e01b))
* Add support for null optional parameter
([#802](#802))
([a817b12](a817b12)),
closes [#736](#736)
* **prebuilt/alloydb-admin-config:** Add alloydb control plane as a
prebuilt config
([#937](#937))
([0b28b72](0b28b72))
* **prebuilt/mysql,prebuilt/mssql:** Add generic mysql and mssql
prebuilt tools
([#983](#983))
([c600c30](c600c30))
* **server/mcp:** Support MCP version 2025-06-18
([#898](#898))
([313d3ca](313d3ca))
* **sources/mssql:** Add support for encrypt connection parameter
([#874](#874))
([14a868f](14a868f))
* **sources/firestore:** Add Firestore as Source
([#786](#786))
([2bb790e](2bb790e))
* **sources/mongodb:** Add MongoDB Source
([#969](#969))
([74dbd61](74dbd61))
* **tools/alloydb-wait-for-operation:** Add wait for operation tool with
exponential backoff
([#920](#920))
([3f6ec29](3f6ec29))
* **tools/mongodb-aggregate:** Add MongoDB `aggregate` Tools
([#977](#977))
([bd399bb](bd399bb))
* **tools/mongodb-delete:** Add MongoDB `delete` Tools
([#974](#974))
([78e9752](78e9752))
* **tools/mongodb-find:** Add MongoDB `find` Tools
([#970](#970))
([a747475](a747475))
* **tools/mongodb-insert:** Add MongoDB `insert` Tools
([#975](#975))
([4c63f0c](4c63f0c))
* **tools/mongodb-update:** Add MongoDB `update` Tools
([#972](#972))
([dfde52c](dfde52c))
* **tools/neo4j-execute-cypher:** Add neo4j-execute-cypher for Neo4j
sources ([#946](#946))
([81d0505](81d0505))
* **tools/neo4j-schema:** Add neo4j-schema tool
([#978](#978))
([be7db3d](be7db3d))
* **tools/wait:** Create wait for tool
([#885](#885))
([ed5ef4c](ed5ef4c))

### Bug Fixes

* Fix document preview pipeline for forked PRs
([#950](#950))
([481cc60](481cc60))
* **prebuilt/firestore:** Mark database field as required in the
firestore prebuilt tools
([#959](#959))
([15417d4](15417d4))
* **prebuilt/cloud-sql-mssql:** Correct source reference for execute_sql
tool in cloud-sql-mssql.yaml prebuilt config
([#938](#938))
([d16728e](d16728e))
* **prebuilt/cloud-sql-mysql:** Update list_table tool
([#924](#924))
([2083ba5](2083ba5))
* Replace 'float' with 'number' in McpManifest
([#985](#985))
([59e23e1](59e23e1))
* **server/api:** Add logger to context in tool invoke handler
([#891](#891))
([8ce311f](8ce311f))
* **sources/looker:** Add agent tag to Looker API calls.
([#966](#966))
([f55dd6f](f55dd6f))
* **tools/bigquery-execute-sql:** Ensure invoke always returns a
non-null value
([#925](#925))
([9a55b80](9a55b80))
* **tools/mysqlsql:** Unmarshal json data from database during invoke
([#979](#979))
([ccc3498](ccc3498)),
closes [#840](#840)

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com> c45390e
github-actions bot pushed a commit to renovate-bot/googleapis-_-genai-toolbox that referenced this pull request Jul 25, 2025
🤖 I have created a release *beep* *boop*
---

##
[0.10.0](googleapis/genai-toolbox@v0.9.0...v0.10.0)
(2025-07-25)

### Features

* Add `Map` parameters support
([googleapis#928](googleapis#928))
([4468bc9](googleapis@4468bc9))
* Add Dataplex source and tool
([googleapis#847](googleapis#847))
([30c16a5](googleapis@30c16a5))
* Add Looker source and tool
([googleapis#923](googleapis#923))
([c67e01b](googleapis@c67e01b))
* Add support for null optional parameter
([googleapis#802](googleapis#802))
([a817b12](googleapis@a817b12)),
closes [googleapis#736](googleapis#736)
* **prebuilt/alloydb-admin-config:** Add alloydb control plane as a
prebuilt config
([googleapis#937](googleapis#937))
([0b28b72](googleapis@0b28b72))
* **prebuilt/mysql,prebuilt/mssql:** Add generic mysql and mssql
prebuilt tools
([googleapis#983](googleapis#983))
([c600c30](googleapis@c600c30))
* **server/mcp:** Support MCP version 2025-06-18
([googleapis#898](googleapis#898))
([313d3ca](googleapis@313d3ca))
* **sources/mssql:** Add support for encrypt connection parameter
([googleapis#874](googleapis#874))
([14a868f](googleapis@14a868f))
* **sources/firestore:** Add Firestore as Source
([googleapis#786](googleapis#786))
([2bb790e](googleapis@2bb790e))
* **sources/mongodb:** Add MongoDB Source
([googleapis#969](googleapis#969))
([74dbd61](googleapis@74dbd61))
* **tools/alloydb-wait-for-operation:** Add wait for operation tool with
exponential backoff
([googleapis#920](googleapis#920))
([3f6ec29](googleapis@3f6ec29))
* **tools/mongodb-aggregate:** Add MongoDB `aggregate` Tools
([googleapis#977](googleapis#977))
([bd399bb](googleapis@bd399bb))
* **tools/mongodb-delete:** Add MongoDB `delete` Tools
([googleapis#974](googleapis#974))
([78e9752](googleapis@78e9752))
* **tools/mongodb-find:** Add MongoDB `find` Tools
([googleapis#970](googleapis#970))
([a747475](googleapis@a747475))
* **tools/mongodb-insert:** Add MongoDB `insert` Tools
([googleapis#975](googleapis#975))
([4c63f0c](googleapis@4c63f0c))
* **tools/mongodb-update:** Add MongoDB `update` Tools
([googleapis#972](googleapis#972))
([dfde52c](googleapis@dfde52c))
* **tools/neo4j-execute-cypher:** Add neo4j-execute-cypher for Neo4j
sources ([googleapis#946](googleapis#946))
([81d0505](googleapis@81d0505))
* **tools/neo4j-schema:** Add neo4j-schema tool
([googleapis#978](googleapis#978))
([be7db3d](googleapis@be7db3d))
* **tools/wait:** Create wait for tool
([googleapis#885](googleapis#885))
([ed5ef4c](googleapis@ed5ef4c))

### Bug Fixes

* Fix document preview pipeline for forked PRs
([googleapis#950](googleapis#950))
([481cc60](googleapis@481cc60))
* **prebuilt/firestore:** Mark database field as required in the
firestore prebuilt tools
([googleapis#959](googleapis#959))
([15417d4](googleapis@15417d4))
* **prebuilt/cloud-sql-mssql:** Correct source reference for execute_sql
tool in cloud-sql-mssql.yaml prebuilt config
([googleapis#938](googleapis#938))
([d16728e](googleapis@d16728e))
* **prebuilt/cloud-sql-mysql:** Update list_table tool
([googleapis#924](googleapis#924))
([2083ba5](googleapis@2083ba5))
* Replace 'float' with 'number' in McpManifest
([googleapis#985](googleapis#985))
([59e23e1](googleapis@59e23e1))
* **server/api:** Add logger to context in tool invoke handler
([googleapis#891](googleapis#891))
([8ce311f](googleapis@8ce311f))
* **sources/looker:** Add agent tag to Looker API calls.
([googleapis#966](googleapis#966))
([f55dd6f](googleapis@f55dd6f))
* **tools/bigquery-execute-sql:** Ensure invoke always returns a
non-null value
([googleapis#925](googleapis#925))
([9a55b80](googleapis@9a55b80))
* **tools/mysqlsql:** Unmarshal json data from database during invoke
([googleapis#979](googleapis#979))
([ccc3498](googleapis@ccc3498)),
closes [googleapis#840](googleapis#840)

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com> c45390e
@nester-neo4j nester-neo4j mentioned this pull request Jul 29, 2025
1 task
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs: deploy-preview Label to trigger Github Action docs preview.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants