-
Notifications
You must be signed in to change notification settings - Fork 1.1k
feat: Neo4j tools enhancements - neo4j-execute-cypher #946
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Neo4j tools enhancements - neo4j-execute-cypher #946
Conversation
|
/gcbrun |
Yuan325
left a comment
There was a problem hiding this 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!
internal/tools/neo4j/neo4jexecutecypher/neo4jexecutecypher_test.go
Outdated
Show resolved
Hide resolved
internal/tools/neo4j/neo4jexecutecypher/classifier/classifier.go
Outdated
Show resolved
Hide resolved
internal/tools/neo4j/neo4jexecutecypher/classifier/classifier.go
Outdated
Show resolved
Hide resolved
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
…test.go Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
…t.go Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
…d classification logic
|
@Yuan325 I addressed all comments, please take a look when have a chance |
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Yuan325
left a comment
There was a problem hiding this 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!
|
/gcbrun |
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
|
@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 |
|
/gcbrun |
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 thank you very much for your help |
…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
🤖 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>
🤖 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
🤖 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
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-cyphertool:neo4j-execute-cypher.mdthat explains the tool's functionality, usage, and configuration options, including the ability to enforce read-only mode for security.cmd/root.gofile to make it available in the toolbox.Query classification functionality:
QueryClassifierinclassifier.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.classifier_test.goto 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.