From 7bc6e7f1b0247ec6242290ad2e7f22ab0c97b4ba Mon Sep 17 00:00:00 2001 From: Eelco van der Wel Date: Thu, 28 Aug 2025 15:54:55 +0200 Subject: [PATCH 01/14] Add Apache License 2.0 to the project --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From b7b695465cf72c3256c14b4909682dd6e34d4c36 Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Thu, 28 Aug 2025 15:55:45 +0200 Subject: [PATCH 02/14] mkdocs first version --- pyproject.toml | 2 + uv.lock | 268 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 270 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 17ce3ab..4550ef3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,7 @@ dependencies = [ "obsidian_mcp", "pdf_mcp", "toolbox_events", + "mkdocs-material[imaging]>=9.6.18", ] [build-system] @@ -40,6 +41,7 @@ extend-select = ["I"] [dependency-groups] dev = [ + "mkdocs-material>=9.6.18", "pre-commit>=4.2.0", "pytest>=8.4.1", "pytest-xdist>=3.8.0", diff --git a/uv.lock b/uv.lock index dc95af4..2ad2048 100644 --- a/uv.lock +++ b/uv.lock @@ -66,6 +66,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, ] +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, +] + [[package]] name = "backoff" version = "2.2.1" @@ -75,6 +84,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" }, ] +[[package]] +name = "backrefs" +version = "5.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload-time = "2025-06-22T19:34:13.97Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload-time = "2025-06-22T19:34:05.252Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload-time = "2025-06-22T19:34:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload-time = "2025-06-22T19:34:08.172Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload-time = "2025-06-22T19:34:09.68Z" }, + { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload-time = "2025-06-22T19:34:11.037Z" }, + { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload-time = "2025-06-22T19:34:12.405Z" }, +] + [[package]] name = "bracex" version = "2.6" @@ -93,6 +116,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/f0/2ef431fe4141f5e334759d73e81120492b23b2824336883a91ac04ba710b/cachetools-6.1.0-py3-none-any.whl", hash = "sha256:1c7bb3cf9193deaf3508b7c5f2a79986c13ea38965c5adcff1f84519cf39163e", size = 11189, upload-time = "2025-06-16T18:51:01.514Z" }, ] +[[package]] +name = "cairocffi" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096, upload-time = "2024-06-18T10:56:06.741Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611, upload-time = "2024-06-18T10:55:59.489Z" }, +] + +[[package]] +name = "cairosvg" +version = "2.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cairocffi" }, + { name = "cssselect2" }, + { name = "defusedxml" }, + { name = "pillow" }, + { name = "tinycss2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload-time = "2025-05-15T06:56:32.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773, upload-time = "2025-05-15T06:56:28.552Z" }, +] + [[package]] name = "certifi" version = "2025.7.14" @@ -242,6 +293,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/87/5c/3dab83cc4aba1f4b0e733e3f0c3e7d4386440d660ba5b1e3ff995feb734d/cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362", size = 3068026, upload-time = "2024-10-18T15:58:11.916Z" }, ] +[[package]] +name = "cssselect2" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tinycss2" }, + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload-time = "2025-03-05T14:46:07.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload-time = "2025-03-05T14:46:06.463Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + [[package]] name = "discord-mcp" version = "0.1.0" @@ -443,6 +516,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/ff/74f23998ad2f93b945c0309f825be92e04e0348e062026998b5eefef4c33/fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993", size = 18272, upload-time = "2020-02-13T21:06:25.209Z" }, ] +[[package]] +name = "ghp-import" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, +] + [[package]] name = "greenlet" version = "3.2.3" @@ -782,6 +867,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload-time = "2024-12-06T11:20:54.538Z" }, ] +[[package]] +name = "markdown" +version = "3.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/c2/4ab49206c17f75cb08d6311171f2d65798988db4360c4d1485bd0eedd67c/markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45", size = 362071, upload-time = "2025-06-19T17:12:44.483Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827, upload-time = "2025-06-19T17:12:42.994Z" }, +] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -869,6 +963,91 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "mergedeep" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ghp-import" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mergedeep" }, + { name = "mkdocs-get-deps" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" }, +] + +[[package]] +name = "mkdocs-material" +version = "9.6.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "backrefs" }, + { name = "click" }, + { name = "colorama" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "mkdocs" }, + { name = "mkdocs-material-extensions" }, + { name = "paginate" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/46/db0d78add5aac29dfcd0a593bcc6049c86c77ba8a25b3a5b681c190d5e99/mkdocs_material-9.6.18.tar.gz", hash = "sha256:a2eb253bcc8b66f8c6eaf8379c10ed6e9644090c2e2e9d0971c7722dc7211c05", size = 4034856, upload-time = "2025-08-22T08:21:47.575Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/0b/545a4f8d4f9057e77f1d99640eb09aaae40c4f9034707f25636caf716ff9/mkdocs_material-9.6.18-py3-none-any.whl", hash = "sha256:dbc1e146a0ecce951a4d84f97b816a54936cdc9e1edd1667fc6868878ac06701", size = 9232642, upload-time = "2025-08-22T08:21:44.52Z" }, +] + +[package.optional-dependencies] +imaging = [ + { name = "cairosvg" }, + { name = "pillow" }, +] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, +] + [[package]] name = "more-itertools" version = "10.7.0" @@ -1156,6 +1335,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] +[[package]] +name = "paginate" +version = "0.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, +] + [[package]] name = "pathspec" version = "0.12.1" @@ -1204,6 +1392,36 @@ dev = [ { name = "pytest-xdist", specifier = ">=3.6.1" }, ] +[[package]] +name = "pillow" +version = "10.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/74/ad3d526f3bf7b6d3f408b73fde271ec69dfac8b81341a318ce825f2b3812/pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", size = 46555059, upload-time = "2024-07-01T09:48:43.583Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/cb/0353013dc30c02a8be34eb91d25e4e4cf594b59e5a55ea1128fde1e5f8ea/pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", size = 3509350, upload-time = "2024-07-01T09:46:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/e7/cf/5c558a0f247e0bf9cec92bff9b46ae6474dd736f6d906315e60e4075f737/pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", size = 3374980, upload-time = "2024-07-01T09:46:19.169Z" }, + { url = "https://files.pythonhosted.org/packages/84/48/6e394b86369a4eb68b8a1382c78dc092245af517385c086c5094e3b34428/pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", size = 4343799, upload-time = "2024-07-01T09:46:21.883Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f3/a8c6c11fa84b59b9df0cd5694492da8c039a24cd159f0f6918690105c3be/pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", size = 4459973, upload-time = "2024-07-01T09:46:24.321Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1b/c14b4197b80150fb64453585247e6fb2e1d93761fa0fa9cf63b102fde822/pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", size = 4370054, upload-time = "2024-07-01T09:46:26.825Z" }, + { url = "https://files.pythonhosted.org/packages/55/77/40daddf677897a923d5d33329acd52a2144d54a9644f2a5422c028c6bf2d/pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", size = 4539484, upload-time = "2024-07-01T09:46:29.355Z" }, + { url = "https://files.pythonhosted.org/packages/40/54/90de3e4256b1207300fb2b1d7168dd912a2fb4b2401e439ba23c2b2cabde/pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", size = 4477375, upload-time = "2024-07-01T09:46:31.756Z" }, + { url = "https://files.pythonhosted.org/packages/13/24/1bfba52f44193860918ff7c93d03d95e3f8748ca1de3ceaf11157a14cf16/pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", size = 4608773, upload-time = "2024-07-01T09:46:33.73Z" }, + { url = "https://files.pythonhosted.org/packages/55/04/5e6de6e6120451ec0c24516c41dbaf80cce1b6451f96561235ef2429da2e/pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", size = 2235690, upload-time = "2024-07-01T09:46:36.587Z" }, + { url = "https://files.pythonhosted.org/packages/74/0a/d4ce3c44bca8635bd29a2eab5aa181b654a734a29b263ca8efe013beea98/pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", size = 2554951, upload-time = "2024-07-01T09:46:38.777Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ca/184349ee40f2e92439be9b3502ae6cfc43ac4b50bc4fc6b3de7957563894/pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", size = 2243427, upload-time = "2024-07-01T09:46:43.15Z" }, + { url = "https://files.pythonhosted.org/packages/c3/00/706cebe7c2c12a6318aabe5d354836f54adff7156fd9e1bd6c89f4ba0e98/pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", size = 3525685, upload-time = "2024-07-01T09:46:45.194Z" }, + { url = "https://files.pythonhosted.org/packages/cf/76/f658cbfa49405e5ecbfb9ba42d07074ad9792031267e782d409fd8fe7c69/pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", size = 3374883, upload-time = "2024-07-01T09:46:47.331Z" }, + { url = "https://files.pythonhosted.org/packages/46/2b/99c28c4379a85e65378211971c0b430d9c7234b1ec4d59b2668f6299e011/pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", size = 4339837, upload-time = "2024-07-01T09:46:49.647Z" }, + { url = "https://files.pythonhosted.org/packages/f1/74/b1ec314f624c0c43711fdf0d8076f82d9d802afd58f1d62c2a86878e8615/pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", size = 4455562, upload-time = "2024-07-01T09:46:51.811Z" }, + { url = "https://files.pythonhosted.org/packages/4a/2a/4b04157cb7b9c74372fa867096a1607e6fedad93a44deeff553ccd307868/pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", size = 4366761, upload-time = "2024-07-01T09:46:53.961Z" }, + { url = "https://files.pythonhosted.org/packages/ac/7b/8f1d815c1a6a268fe90481232c98dd0e5fa8c75e341a75f060037bd5ceae/pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", size = 4536767, upload-time = "2024-07-01T09:46:56.664Z" }, + { url = "https://files.pythonhosted.org/packages/e5/77/05fa64d1f45d12c22c314e7b97398ffb28ef2813a485465017b7978b3ce7/pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", size = 4477989, upload-time = "2024-07-01T09:46:58.977Z" }, + { url = "https://files.pythonhosted.org/packages/12/63/b0397cfc2caae05c3fb2f4ed1b4fc4fc878f0243510a7a6034ca59726494/pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", size = 4610255, upload-time = "2024-07-01T09:47:01.189Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f9/cfaa5082ca9bc4a6de66ffe1c12c2d90bf09c309a5f52b27759a596900e7/pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", size = 2235603, upload-time = "2024-07-01T09:47:03.918Z" }, + { url = "https://files.pythonhosted.org/packages/01/6a/30ff0eef6e0c0e71e55ded56a38d4859bf9d3634a94a88743897b5f96936/pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", size = 2554972, upload-time = "2024-07-01T09:47:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/48/2c/2e0a52890f269435eee38b21c8218e102c621fe8d8df8b9dd06fabf879ba/pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", size = 2243375, upload-time = "2024-07-01T09:47:09.065Z" }, +] + [[package]] name = "platformdirs" version = "4.3.8" @@ -1404,6 +1622,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pymdown-extensions" +version = "10.16.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload-time = "2025-07-28T16:19:34.167Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" }, +] + [[package]] name = "pytest" version = "8.4.1" @@ -1523,6 +1754,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, ] +[[package]] +name = "pyyaml-env-tag" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, +] + [[package]] name = "rapidfuzz" version = "3.13.0" @@ -2292,6 +2535,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, ] +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, +] + [[package]] name = "tokenizers" version = "0.21.4" @@ -2353,6 +2608,7 @@ name = "toolbox-mono" version = "0.1.0" source = { editable = "." } dependencies = [ + { name = "mkdocs-material", extra = ["imaging"] }, { name = "notes-mcp" }, { name = "obsidian-mcp" }, { name = "pdf-mcp" }, @@ -2365,6 +2621,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "mkdocs-material" }, { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-xdist" }, @@ -2373,6 +2630,7 @@ dev = [ [package.metadata] requires-dist = [ + { name = "mkdocs-material", extras = ["imaging"], specifier = ">=9.6.18" }, { name = "notes-mcp", editable = "packages/notes_mcp" }, { name = "obsidian-mcp", editable = "packages/obsidian_mcp" }, { name = "pdf-mcp", editable = "packages/pdf_mcp" }, @@ -2385,6 +2643,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "mkdocs-material", specifier = ">=9.6.18" }, { name = "pre-commit", specifier = ">=4.2.0" }, { name = "pytest", specifier = ">=8.4.1" }, { name = "pytest-xdist", specifier = ">=3.8.0" }, @@ -2661,6 +2920,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/df/4ee467ab39cc1de4b852c212c1ed3becfec2e486a51ac1ce0091f85f38d7/wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a", size = 39347, upload-time = "2024-09-26T18:39:51.002Z" }, ] +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + [[package]] name = "websockets" version = "15.0.1" From c2bbf4335517366bf0493d7f92de8825c3bd944e Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Thu, 28 Aug 2025 16:26:22 +0200 Subject: [PATCH 03/14] test mkdocs --- .github/workflows/docs.yml | 41 +++++++ CONTRIBUTING.md | 8 ++ README.md | 10 +- docs/assets/logo.svg | 28 +++++ docs/assets/stylesheets/extra.css | 154 +++++++++++++++++++++++++++ docs/{ => features}/notifications.md | 0 docs/{ => features}/triggers.md | 0 docs/getting-started/installation.md | 60 +++++++++++ docs/getting-started/quick-start.md | 101 ++++++++++++++++++ docs/index.md | 74 +++++++++++++ docs/use-cases/slack.md | 1 + mkdocs.yml | 67 ++++++++++++ 12 files changed, 541 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/docs.yml create mode 100644 docs/assets/logo.svg create mode 100644 docs/assets/stylesheets/extra.css rename docs/{ => features}/notifications.md (100%) rename docs/{ => features}/triggers.md (100%) create mode 100644 docs/getting-started/installation.md create mode 100644 docs/getting-started/quick-start.md create mode 100644 docs/index.md create mode 100644 docs/use-cases/slack.md create mode 100644 mkdocs.yml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..87bbfaa --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,41 @@ +# name: Deploy Beta Documentation + +# on: +# push: +# branches: +# - "**/mkdocs" +# workflow_dispatch: + +# permissions: +# contents: write + +# jobs: +# deploy: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 + +# - name: Configure Git Credentials +# run: | +# git config user.name github-actions[bot] +# git config user.email 41898282+github-actions[bot]@users.noreply.github.com + +# - uses: actions/setup-python@v5 +# with: +# python-version: 3.x + +# - name: Set up cache +# run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV + +# - uses: actions/cache@v4 +# with: +# key: mkdocs-material-${{ env.cache_id }} +# path: .cache +# restore-keys: | +# mkdocs-material- + +# - name: Install dependencies +# run: pip install mkdocs-material + +# - name: Build and deploy to beta +# run: mkdocs gh-deploy --force --remote-branch gh-pages --remote-name origin diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 753a386..10a6e8c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -71,3 +71,11 @@ rm -rf dist/ uv build --package syft_toolbox uv publish dist/syft-toolbox-* --token ``` + +## Documentation + +To serve the docs locally, run this in the repo root: + +``` +mkdocs serve +``` diff --git a/README.md b/README.md index d3f714a..b4533be 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Toolbox is a cli tool for installing and managing [MCP](https://github.com/model - Toolbox supports popular developer tools (think github, slack, discord, obsidian, gmail etc.), and clients (claude desktop, cursor), making it easier to deploy useful MCP servers without having them managed by a specific client - With toolbox you can install **mcp servers** with **background agents** and their dependencies using - `toolbox install ` + `tb install ` - background agents download your data or index it (OCR/transcription/embeddings for RAG); you can choose between fully local or free hosted in [openmined enclaves](#hosted-option-with-enclaves) ## TOC @@ -113,7 +113,7 @@ tb log | Name | Clients | Default Deployment | Read Access | Write Access | Install | | -------------------- | ------- | ------------------- | ---------------------- | --------------------- | --------------------------------- | | slack-mcp | claude | proxy-to-om-enclave | Slack Messages | Slack Messages | `tb install slack-mcp` | -| discord-mcp | claude | proxy-to-om-enclave | Discord Messages | Discord Messages | `tb install slack-mcp` | +| discord-mcp | claude | proxy-to-om-enclave | Discord Messages | Discord Messages | `tb install discord-mcp` | | obsidian-mcp | claude | proxy-to-om-enclave | Obsidian notes | Obsidian Notes | `tb install obsidian-mcp` | | github-mcp | claude | stdio | Issues, PRs, Settings | Issues, PRs, Settings | `tb install github-mcp` | | whatsapp-desktop-mcp | claude | proxy-to-om-enclave | WhatsApp Messages | WhatsApp Messages | `tb install whatsapp-desktop-mcp` | @@ -122,7 +122,11 @@ tb log # Triggers -Toolbox can run scripts on a schedule to automate tasks in your MCP pipeline. See the [triggers documentation](docs/triggers.md) for setup and usage instructions. +Toolbox can run scripts on a schedule to automate tasks in your MCP pipeline. See the [triggers documentation](docs/features/triggers.md) for setup and usage instructions. + +# Notifications + +Send notifications from your triggers and MCP servers using ntfy.sh. See the [notifications documentation](docs/features/notifications.md) for configuration and usage. ## Troubleshooting screenpipe diff --git a/docs/assets/logo.svg b/docs/assets/logo.svg new file mode 100644 index 0000000..998488d --- /dev/null +++ b/docs/assets/logo.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css new file mode 100644 index 0000000..2a29d10 --- /dev/null +++ b/docs/assets/stylesheets/extra.css @@ -0,0 +1,154 @@ +/* Clean white header theme */ +[data-md-color-primary="white"] { + --md-primary-fg-color: #ffffff; + --md-primary-fg-color--light: #f3f4f6; + --md-primary-fg-color--dark: #ffffff; + --md-primary-bg-color: rgb(46, 43, 59); + --md-primary-bg-color--light: rgb(46, 43, 59); +} + +/* Fix header text colors for white background */ +.md-header { + background-color: #ffffff !important; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1) !important; +} + +.md-header [data-md-component="header-title"] { + color: rgb(46, 43, 59) !important; +} + +/* Fix all header navigation colors */ +.md-header .md-header__button, +.md-header .md-header__topic, +.md-header .md-header__title, +.md-header .md-nav__title, +.md-header .md-nav__button, +.md-header .md-source__icon { + color: rgb(46, 43, 59) !important; +} + +/* Fix search styling */ +.md-search__form { + background-color: #f3f4f6 !important; + border-radius: 4px; +} + +.md-search__input { + background-color: transparent !important; + color: rgb(46, 43, 59) !important; +} + +.md-search__input::placeholder { + color: #6b7280 !important; +} + +.md-search__icon[for="__search"] { + color: #6b7280 !important; +} + +/* Theme toggle icons */ +.md-header .md-header__button svg { + fill: rgb(46, 43, 59) !important; +} + +/* Hover states */ +.md-header .md-header__button:hover, +.md-header .md-nav__button:hover { + opacity: 0.7; +} + +/* Clean link colors */ +.md-nav__link--active, +.md-nav__link:active { + color: #764ba2; +} + +.md-nav__link:hover { + color: #667eea; +} + +/* Footer styling - matching SyftBox docs */ +.md-footer { + background-color: #3b3f4f !important; + color: #ffffff !important; +} + +.md-footer-meta { + background-color: #3b3f4f !important; +} + +.md-footer__link { + color: #ffffff !important; +} + +.md-footer__link:hover { + opacity: 0.8; +} + +.md-footer-copyright { + color: rgba(255, 255, 255, 0.8) !important; +} + +/* Dark theme styling */ +[data-md-color-scheme="slate"] { + --md-primary-fg-color: #3b3f4f; + --md-primary-fg-color--light: #424755; + --md-primary-fg-color--dark: #3b3f4f; +} + +/* Dark theme header - matches footer color */ +[data-md-color-scheme="slate"] .md-header { + background-color: #3b3f4f !important; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.3) !important; +} + +/* Dark theme header text colors */ +[data-md-color-scheme="slate"] .md-header [data-md-component="header-title"], +[data-md-color-scheme="slate"] .md-header .md-header__button, +[data-md-color-scheme="slate"] .md-header .md-header__topic, +[data-md-color-scheme="slate"] .md-header .md-header__title, +[data-md-color-scheme="slate"] .md-header .md-nav__title, +[data-md-color-scheme="slate"] .md-header .md-nav__button, +[data-md-color-scheme="slate"] .md-header .md-source__icon { + color: #ffffff !important; +} + +/* Dark theme search styling */ +[data-md-color-scheme="slate"] .md-search__form { + background-color: rgba(255, 255, 255, 0.1) !important; +} + +[data-md-color-scheme="slate"] .md-search__input { + color: #ffffff !important; +} + +[data-md-color-scheme="slate"] .md-search__input::placeholder { + color: rgba(255, 255, 255, 0.6) !important; +} + +[data-md-color-scheme="slate"] .md-search__icon[for="__search"] { + color: rgba(255, 255, 255, 0.6) !important; +} + +/* Dark theme icons */ +[data-md-color-scheme="slate"] .md-header .md-header__button svg { + fill: #ffffff !important; +} + +/* Dark theme hover states */ +[data-md-color-scheme="slate"] .md-header .md-header__button:hover, +[data-md-color-scheme="slate"] .md-header .md-nav__button:hover { + opacity: 0.7; +} + +/* Fix logo spacing based on GitHub discussion */ +.md-header__button.md-logo { + margin: 0 !important; + padding-left: 0 !important; +} + +/* .md-header__button.md-logo img, +.md-header__button.md-logo svg { + height: 24px !important; + width: auto !important; +} */ diff --git a/docs/notifications.md b/docs/features/notifications.md similarity index 100% rename from docs/notifications.md rename to docs/features/notifications.md diff --git a/docs/triggers.md b/docs/features/triggers.md similarity index 100% rename from docs/triggers.md rename to docs/features/triggers.md diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md new file mode 100644 index 0000000..b06173f --- /dev/null +++ b/docs/getting-started/installation.md @@ -0,0 +1,60 @@ +# Installation + +## Requirements + +Before installing Toolbox, ensure you have: + +- **Python 3.12 or later** +- **[uv](https://docs.astral.sh/uv/getting-started/installation/)** - Fast Python package installer + +## Install from PyPI + +The recommended way to install Toolbox: + +```bash +uv tool install --prerelease allow --python 3.12 -U syft-toolbox +``` + +Verify the installation: + +```bash +tb info +``` + +## Install from Source + +For development or latest features: + +```bash +git clone https://github.com/OpenMined/toolbox.git +cd toolbox +uv pip install -e . +``` + +## Troubleshooting + +### CLang Issues + +If you encounter CLang errors during installation: + +```bash +uv python install --reinstall +``` + +This [fixes Python in uv](https://github.com/astral-sh/python-build-standalone/pull/414). + +### C++ Include Errors + +If you see `#include ` errors: + +```bash +CXXFLAGS="-isystem $(xcrun --show-sdk-path)/usr/include/c++/v1" uv pip install -e . +``` + +### Permission Issues + +If you get permission errors, ensure you have write access to the uv tool directory. You may need to use `sudo` or adjust your PATH. + +## Next Steps + +After installation, proceed to the [Quick Start](quick-start.md) guide to install your first MCP server. diff --git a/docs/getting-started/quick-start.md b/docs/getting-started/quick-start.md new file mode 100644 index 0000000..efb3374 --- /dev/null +++ b/docs/getting-started/quick-start.md @@ -0,0 +1,101 @@ +# Quick Start + +This guide will get you up and running with Toolbox in minutes. + +## First Steps + +### 1. Verify Installation + +After [installing Toolbox](installation.md), verify it's working: + +```bash +tb info +``` + +### 2. Initial Setup + +Run the setup command to configure Toolbox: + +```bash +tb setup +``` + +This will: + +- Configure your notification settings +- Set up analytics preferences +- Create necessary directories + +## Basic Commands + +### Browse Available MCP Servers + +See what's available to install: + +```bash +tb list-store +``` + +### Install Your First MCP Server + +Let's start with a popular one - Slack: + +```bash +tb install slack-mcp +``` + +Follow the prompts to: + +1. Authenticate with Slack +2. Configure which workspaces to monitor +3. Set up any background agents + +### List Installed Apps + +View all your installed MCP servers: + +```bash +tb list +``` + +### Check App Details + +Get detailed information about an installed app: + +```bash +tb show slack-mcp +``` + +### View Logs + +Monitor what your MCP server is doing: + +```bash +# View recent logs +tb log slack-mcp + +# Follow logs in real-time +tb log slack-mcp -f +``` + +## Using with Claude + +Once you've installed an MCP server, it's automatically available in Claude Desktop: + +1. Open Claude Desktop +2. Start a new conversation +3. Your MCP servers will be available as tools Claude can use +4. Try asking: "Show me my recent Slack messages" + +## What's Next? + +- Learn about [Triggers](../features/triggers.md) to automate tasks +- Set up [Notifications](../features/notifications.md) for important events +- Browse available MCP servers with `tb list-store` +- Check out [Use Cases](../use-cases/slack.md) for inspiration + +## Getting Help + +- Run `tb --help` for command documentation +- Report issues at [GitHub Issues](https://github.com/OpenMined/toolbox/issues) +- Join our community discussions diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..62a7bc6 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,74 @@ +# Toolbox + +[![PyPI version](https://badge.fury.io/py/syft-toolbox.svg)](https://badge.fury.io/py/syft-toolbox) +[![Python](https://img.shields.io/pypi/pyversions/syft-toolbox)](https://pypi.org/project/syft-toolbox/) +[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/OpenMined/toolbox/blob/main/LICENSE) +[![GitHub stars](https://img.shields.io/github/stars/OpenMined/toolbox?style=social)](https://github.com/OpenMined/toolbox) + +A privacy-first tool to install MCP servers and background agents for your personal data. + +
+ +## Overview + +Toolbox is a CLI tool for installing and managing [MCP](https://github.com/modelcontextprotocol/python-sdk) servers and background agents, **made for developers**. + +- Install **MCP servers** with **background agents** using `tb install ` +- Support for popular developer tools (GitHub, Slack, Discord, Obsidian, Gmail, etc.) +- Compatible with multiple clients (Claude Desktop, Cursor) +- Choose between fully local or free hosted options + +## Quick Start + +### Installation + +```bash +# Install via uv +uv tool install --prerelease allow --python 3.12 -U syft-toolbox + +# Verify installation +tb info +``` + +### Basic Commands + +```bash +# List available apps +tb list-store + +# Install an app +tb install slack-mcp + +# List installed apps +tb list + +# Show app details +tb show +``` + +## Features + +### [Triggers](features/triggers.md) + +Automate tasks with scheduled scripts and event-driven workflows. + +### [Notifications](features/notifications.md) + +Send notifications from your triggers and MCP servers using ntfy.sh. + +## Available MCP Servers + +| Name | Description | Install | +| -------------------- | --------------------------- | --------------------------------- | +| slack-mcp | Access Slack messages | `tb install slack-mcp` | +| discord-mcp | Access Discord messages | `tb install discord-mcp` | +| obsidian-mcp | Manage Obsidian notes | `tb install obsidian-mcp` | +| github-mcp | Manage GitHub issues & PRs | `tb install github-mcp` | +| whatsapp-desktop-mcp | Access WhatsApp messages | `tb install whatsapp-desktop-mcp` | +| pdf-mcp | Process local documents | `tb install pdf-mcp` | +| meeting-notes-mcp | Transcribe audio recordings | `tb install meeting-notes-mcp` | + +## Links + +- [GitHub Repository](https://github.com/OpenMined/toolbox) +- [PyPI Package](https://pypi.org/project/syft-toolbox/) diff --git a/docs/use-cases/slack.md b/docs/use-cases/slack.md new file mode 100644 index 0000000..2d7066b --- /dev/null +++ b/docs/use-cases/slack.md @@ -0,0 +1 @@ +# Slack Integration Use Cases diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..3a82fc9 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,67 @@ +site_name: Toolbox +site_description: Privacy-first toolbox for installing local and remote MCP servers +site_url: https://openmined.github.io/toolbox + +theme: + name: material + favicon: assets/logo.svg + logo: assets/logo.svg + features: + - search.suggest + - search.highlight + - navigation.tabs + - navigation.tabs.sticky + - navigation.sections + - navigation.expand + - content.code.copy + palette: + - media: "(prefers-color-scheme: light)" + scheme: default + primary: white + accent: deep orange + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: grey + accent: deep orange + toggle: + icon: material/brightness-4 + name: Switch to light mode + +repo_url: https://github.com/OpenMined/toolbox +repo_name: OpenMined/toolbox + +plugins: + - search + +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/OpenMined/toolbox + - icon: fontawesome/brands/python + link: https://pypi.org/project/syft-toolbox/ + generator: false + +extra_css: + - assets/stylesheets/extra.css + +nav: + - Getting Started: + - Overview: index.md + - Installation: getting-started/installation.md + - Quick Start: getting-started/quick-start.md + - Features: + - Triggers: features/triggers.md + - Notifications: features/notifications.md + - Use Cases: + - Slack: use-cases/slack.md + +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.superfences + - admonition + - toc: + permalink: true From 05a0f40dc3ac82a6a412c190302797cb2a0db4a8 Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Thu, 28 Aug 2025 17:52:41 +0200 Subject: [PATCH 04/14] test deploy docs --- .github/workflows/docs.yml | 69 ++++++++++++++++---------------------- docs/index.md | 3 ++ mkdocs.yml | 1 + 3 files changed, 32 insertions(+), 41 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 87bbfaa..4575b3f 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,41 +1,28 @@ -# name: Deploy Beta Documentation - -# on: -# push: -# branches: -# - "**/mkdocs" -# workflow_dispatch: - -# permissions: -# contents: write - -# jobs: -# deploy: -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v4 - -# - name: Configure Git Credentials -# run: | -# git config user.name github-actions[bot] -# git config user.email 41898282+github-actions[bot]@users.noreply.github.com - -# - uses: actions/setup-python@v5 -# with: -# python-version: 3.x - -# - name: Set up cache -# run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV - -# - uses: actions/cache@v4 -# with: -# key: mkdocs-material-${{ env.cache_id }} -# path: .cache -# restore-keys: | -# mkdocs-material- - -# - name: Install dependencies -# run: pip install mkdocs-material - -# - name: Build and deploy to beta -# run: mkdocs gh-deploy --force --remote-branch gh-pages --remote-name origin +name: deploy mkdocs +on: + push: + branches: + - "**/mkdocs" +permissions: + contents: write +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Configure Git Credentials + run: | + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + - uses: actions/setup-python@v5 + with: + python-version: 3.x + - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV + - uses: actions/cache@v4 + with: + key: mkdocs-material-${{ env.cache_id }} + path: ~/.cache + restore-keys: | + mkdocs-material- + - run: pip install mkdocs-material + - run: mkdocs gh-deploy --force diff --git a/docs/index.md b/docs/index.md index 62a7bc6..ee2c635 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,3 +1,6 @@ +!!! warning "Beta Documentation" +These docs are in beta and subject to change. Please refer to the [README.md](https://github.com/OpenMined/toolbox/blob/main/README.md) for the latest information. + # Toolbox [![PyPI version](https://badge.fury.io/py/syft-toolbox.svg)](https://badge.fury.io/py/syft-toolbox) diff --git a/mkdocs.yml b/mkdocs.yml index 3a82fc9..a1527a5 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -9,6 +9,7 @@ theme: features: - search.suggest - search.highlight + - navigation.instant - navigation.tabs - navigation.tabs.sticky - navigation.sections From de6b2e3a3b041925b1d91f3f14deca78e1ed470d Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Thu, 28 Aug 2025 18:05:05 +0200 Subject: [PATCH 05/14] fix dependencies --- pyproject.toml | 3 +-- uv.lock | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4550ef3..f8defcb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,6 @@ dependencies = [ "obsidian_mcp", "pdf_mcp", "toolbox_events", - "mkdocs-material[imaging]>=9.6.18", ] [build-system] @@ -41,7 +40,7 @@ extend-select = ["I"] [dependency-groups] dev = [ - "mkdocs-material>=9.6.18", + "mkdocs-material[imaging]>=9.6.18", "pre-commit>=4.2.0", "pytest>=8.4.1", "pytest-xdist>=3.8.0", diff --git a/uv.lock b/uv.lock index 2ad2048..62ee660 100644 --- a/uv.lock +++ b/uv.lock @@ -2608,7 +2608,6 @@ name = "toolbox-mono" version = "0.1.0" source = { editable = "." } dependencies = [ - { name = "mkdocs-material", extra = ["imaging"] }, { name = "notes-mcp" }, { name = "obsidian-mcp" }, { name = "pdf-mcp" }, @@ -2621,7 +2620,7 @@ dependencies = [ [package.dev-dependencies] dev = [ - { name = "mkdocs-material" }, + { name = "mkdocs-material", extra = ["imaging"] }, { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-xdist" }, @@ -2630,7 +2629,6 @@ dev = [ [package.metadata] requires-dist = [ - { name = "mkdocs-material", extras = ["imaging"], specifier = ">=9.6.18" }, { name = "notes-mcp", editable = "packages/notes_mcp" }, { name = "obsidian-mcp", editable = "packages/obsidian_mcp" }, { name = "pdf-mcp", editable = "packages/pdf_mcp" }, @@ -2643,7 +2641,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "mkdocs-material", specifier = ">=9.6.18" }, + { name = "mkdocs-material", extras = ["imaging"], specifier = ">=9.6.18" }, { name = "pre-commit", specifier = ">=4.2.0" }, { name = "pytest", specifier = ">=8.4.1" }, { name = "pytest-xdist", specifier = ">=3.8.0" }, From 8d7c7780d02fa70efe5d55de2691b1ba5798b2d9 Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Thu, 28 Aug 2025 22:12:59 +0200 Subject: [PATCH 06/14] remove video --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index ee2c635..79d101b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -10,7 +10,7 @@ These docs are in beta and subject to change. Please refer to the [README.md](ht A privacy-first tool to install MCP servers and background agents for your personal data. -
+ ## Overview From 59e6711638cd78f24c20ce9ed144394f7d71ef4b Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Fri, 29 Aug 2025 12:02:20 +0200 Subject: [PATCH 07/14] fix trigger docs --- docs/features/triggers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/triggers.md b/docs/features/triggers.md index 6021872..fcad14b 100644 --- a/docs/features/triggers.md +++ b/docs/features/triggers.md @@ -109,7 +109,7 @@ tb trigger add \ --name "obsidian-event-processor" \ --script "/path/to/your/script.py" \ --event "file.created" \ - --event "file.updated" \ + --event "file.modified" \ --event "file.deleted" \ --event-source "obsidian-mcp" ``` From d282f1693a6ac05205ac5a663d80fd7774f48cf4 Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Fri, 29 Aug 2025 14:01:15 +0200 Subject: [PATCH 08/14] add docs versioning --- .github/workflows/docs.yml | 18 ++++++++-- CLAUDE.md | 47 ++++++++++++++++++++++++++ CONTRIBUTING.md | 13 +++++++ mkdocs.yml | 4 +++ pyproject.toml | 1 + uv.lock | 69 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 150 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 4575b3f..259b578 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -2,7 +2,10 @@ name: deploy mkdocs on: push: branches: + - main - "**/mkdocs" + tags: + - "v[0-9]+.[0-9]+.[0-9]+" permissions: contents: write jobs: @@ -10,6 +13,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch all history for mike - name: Configure Git Credentials run: | git config user.name github-actions[bot] @@ -24,5 +29,14 @@ jobs: path: ~/.cache restore-keys: | mkdocs-material- - - run: pip install mkdocs-material - - run: mkdocs gh-deploy --force + - run: pip install mkdocs-material mike + - name: Deploy dev version (main branch) + if: github.ref == 'refs/heads/main' || endsWith(github.ref, '/mkdocs') + run: mike deploy --push dev + + - name: Deploy tagged version + if: startsWith(github.ref, 'refs/tags/v') + run: | + VERSION=${GITHUB_REF#refs/tags/v} + mike deploy --push --update-aliases $VERSION latest + mike set-default --push latest diff --git a/CLAUDE.md b/CLAUDE.md index f570993..b22df50 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -109,3 +109,50 @@ cd packages/syftbox_queryengine - You can first start the syftbox_queryengine, and then start the notes_mcp - The Syftboxquery engine will register an account with the NoteMCP server - The NoteMCP server will then start polling the Syftbox query engine for new data and indexed data + +## Documentation Development + +### Setup + +Documentation uses MkDocs with Material theme, managed as part of the uv workspace: + +```bash +# Install dev dependencies (includes mkdocs-material) +uv sync + +# Serve docs locally with hot reload +uv run mkdocs serve + +# Build static site +uv run mkdocs build +``` + +### Documentation Structure + +- **docs/**: Main documentation directory + - **index.md**: Landing page with overview + - **getting-started/**: Installation and quick start guides + - **features/**: Feature documentation (triggers, notifications) + - **use-cases/**: Specific use case examples (Slack integration) + - **assets/**: Static assets (logo, custom CSS) +- **mkdocs.yml**: MkDocs configuration with navigation and theme settings + +### Deployment + +Documentation automatically deploys to GitHub Pages at https://openmined.github.io/toolbox when pushing to branches ending with `/mkdocs`: + +```bash +# Push to trigger deployment +git push origin your-branch/mkdocs +``` + +The GitHub Actions workflow (`.github/workflows/docs.yml`) handles deployment using `mkdocs gh-deploy`. + +### Style Guidelines + +- Use Material theme features for consistent styling +- Include code examples with syntax highlighting +- Add appropriate admonitions (warning, info, tip) for important information +- Keep navigation structure flat and intuitive +- Use tables for comparing features or listing options +- Follow the existing CSS theme in `docs/assets/stylesheets/extra.css` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 10a6e8c..032f600 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -72,6 +72,19 @@ uv build --package syft_toolbox uv publish dist/syft-toolbox-* --token ``` +### Documentation Versioning + +Documentation is automatically deployed via GitHub Actions when creating version tags. +If automatic deployment fails, you can manually deploy docs: + +```bash +# Deploy a new version and update the latest alias +mike deploy --push --update-aliases ${NEW_VERSION} latest + +# Set default version (only needed for first release) +mike set-default --push latest +``` + ## Documentation To serve the docs locally, run this in the repo root: diff --git a/mkdocs.yml b/mkdocs.yml index a1527a5..9b416a8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -38,6 +38,10 @@ plugins: - search extra: + version: + provider: mike + default: latest + alias: true social: - icon: fontawesome/brands/github link: https://github.com/OpenMined/toolbox diff --git a/pyproject.toml b/pyproject.toml index f8defcb..e5ff713 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,6 +40,7 @@ extend-select = ["I"] [dependency-groups] dev = [ + "mike>=2.1.3", "mkdocs-material[imaging]>=9.6.18", "pre-commit>=4.2.0", "pytest>=8.4.1", diff --git a/uv.lock b/uv.lock index 62ee660..a0c53e8 100644 --- a/uv.lock +++ b/uv.lock @@ -681,6 +681,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] +[[package]] +name = "importlib-metadata" +version = "8.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, +] + +[[package]] +name = "importlib-resources" +version = "6.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693, upload-time = "2025-01-03T18:51:56.698Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461, upload-time = "2025-01-03T18:51:54.306Z" }, +] + [[package]] name = "iniconfig" version = "2.1.0" @@ -972,6 +993,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, ] +[[package]] +name = "mike" +version = "2.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata" }, + { name = "importlib-resources" }, + { name = "jinja2" }, + { name = "mkdocs" }, + { name = "pyparsing" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "verspec" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/f7/2933f1a1fb0e0f077d5d6a92c6c7f8a54e6128241f116dff4df8b6050bbf/mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810", size = 38119, upload-time = "2024-08-13T05:02:14.167Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/1a/31b7cd6e4e7a02df4e076162e9783620777592bea9e4bb036389389af99d/mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a", size = 33754, upload-time = "2024-08-13T05:02:12.515Z" }, +] + [[package]] name = "mkdocs" version = "1.6.1" @@ -1635,6 +1675,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" }, ] +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload-time = "2025-03-25T05:01:28.114Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" }, +] + [[package]] name = "pytest" version = "8.4.1" @@ -2620,6 +2669,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "mike" }, { name = "mkdocs-material", extra = ["imaging"] }, { name = "pre-commit" }, { name = "pytest" }, @@ -2641,6 +2691,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "mike", specifier = ">=2.1.3" }, { name = "mkdocs-material", extras = ["imaging"], specifier = ">=9.6.18" }, { name = "pre-commit", specifier = ">=4.2.0" }, { name = "pytest", specifier = ">=8.4.1" }, @@ -2801,6 +2852,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" }, ] +[[package]] +name = "verspec" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/44/8126f9f0c44319b2efc65feaad589cadef4d77ece200ae3c9133d58464d0/verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e", size = 27123, upload-time = "2020-11-30T02:24:09.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/ce/3b6fee91c85626eaf769d617f1be9d2e15c1cca027bbdeb2e0d751469355/verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31", size = 19640, upload-time = "2020-11-30T02:24:08.387Z" }, +] + [[package]] name = "virtualenv" version = "20.32.0" @@ -3007,3 +3067,12 @@ sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b66 wheels = [ { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload-time = "2024-12-07T15:28:26.465Z" }, ] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +] From 2b83af580546aaf898101b1ee56317034afeb85d Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Fri, 29 Aug 2025 14:11:16 +0200 Subject: [PATCH 09/14] add version warning --- docs/overrides/main.html | 6 ++++++ mkdocs.yml | 1 + 2 files changed, 7 insertions(+) create mode 100644 docs/overrides/main.html diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 0000000..68756ec --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} {% block outdated %} You're viewing an outdated +version of the documentation. + + Click here to view the latest stable version. + +{% endblock %} diff --git a/mkdocs.yml b/mkdocs.yml index 9b416a8..ce756a6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,6 +4,7 @@ site_url: https://openmined.github.io/toolbox theme: name: material + custom_dir: docs/overrides favicon: assets/logo.svg logo: assets/logo.svg features: From 6e49328943726a2ed1d4b2fb0b73308398f28c7d Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Fri, 29 Aug 2025 14:17:38 +0200 Subject: [PATCH 10/14] fix warning banner --- docs/assets/stylesheets/extra.css | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css index 2a29d10..84039c1 100644 --- a/docs/assets/stylesheets/extra.css +++ b/docs/assets/stylesheets/extra.css @@ -152,3 +152,22 @@ height: 24px !important; width: auto !important; } */ + +/* Version warning banner styling */ +.md-banner--warning { + background-color: #ff6b35 !important; + color: #ffffff !important; +} + +.md-banner--warning a { + color: #ffffff !important; +} + +.md-banner--warning a:hover { + opacity: 0.9; +} + +.md-banner--warning strong { + color: #ffffff !important; + font-weight: 600; +} From 09a8b17757bbc45542af4d0951ca90e9c90fc231 Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Fri, 29 Aug 2025 15:08:38 +0200 Subject: [PATCH 11/14] update trigger docs --- docs/features/triggers.md | 187 +++++++++++++++++++++++++++----------- mkdocs.yml | 3 + 2 files changed, 137 insertions(+), 53 deletions(-) diff --git a/docs/features/triggers.md b/docs/features/triggers.md index fcad14b..13e57eb 100644 --- a/docs/features/triggers.md +++ b/docs/features/triggers.md @@ -1,81 +1,84 @@ # Triggers -Toolbox can run scripts defined by you on a schedule. This is useful for automating tasks as part of your MCP pipeline. +Toolbox triggers allow you to automate tasks in your MCP pipeline. Triggers can run on a schedule or respond to events from MCP servers. + +## Types of Triggers + +Toolbox supports two types of triggers: + +1. **Scheduled Triggers** - Run scripts at specific times using cron expressions +2. **Event-Driven Triggers** - Run scripts in response to events from MCP servers ## Setup -First, to be able to run triggers, you need to install the toolbox daemon. This will add the toolbox daemon to your launchd, so it will start automatically when you login. +To use triggers, you need to install the toolbox daemon. This will add the toolbox daemon to your launchd, so it will start automatically when you login. -``` +```bash tb daemon install ``` To uninstall and remove from launchd: -``` +```bash tb daemon uninstall ``` To see the status of the daemon: -``` +```bash tb daemon status ``` -## Creating Triggers - -As example, we have provided a script to search github for repositories with the keyword "MCP". - -``` -# Run `search_github_trigger.py` daily at 12:00 -tb trigger add --name "github-trending" --script "examples/search_github_trigger.py" --cron "0 12 * * *" -``` - -## Managing Triggers +## Scheduled Triggers -To uninstall a trigger: +Scheduled triggers run scripts at specific times using cron expressions. -``` -tb trigger uninstall "github-trending" -``` - -To show all triggers: +### Creating a Scheduled Trigger -``` -tb trigger list -``` +As an example trigger, the toolbox repository contains a script that scrapes trending github repositories that contain 'MCP' keywords. We can register this script to run daily at 12:00 by using the following command: -To show the status and last 5 executions of a trigger: - -``` -tb trigger show github-trending -n 5 +```bash +tb trigger add \ + --name "github-trending" \ + --script "examples/search_github_trigger.py" \ + --cron "0 12 * * *" ``` -## Cron Expressions +### Cron Expressions -The `--cron` parameter accepts standard cron expressions to schedule triggers at a specific time or interval. For example: +The `--cron` parameter accepts standard cron expressions: - `0 12 * * *` - Daily at 12:00 - `0 */6 * * *` - Every 6 hours - `0 9 * * 1` - Every Monday at 9:00 -For more detailed cron syntax and examples, see [crontab.guru](https://crontab.guru/) - an interactive cron expression editor and reference. +For more detailed cron syntax and examples, see [crontab.guru](https://crontab.guru/). ## Event-Driven Triggers -Triggers can respond to events sent by MCP servers. Toolbox automatically configures the environment so events are routed correctly. +Event-driven triggers respond to events sent by MCP servers. Toolbox automatically routes events from MCP servers to registered trigger scripts. + +### Example: Slack to Obsidian Workflow -### Sending Events from MCP Servers +To illustrate how event-driven triggers work, let's create an example workflow that automatically saves Slack mentions to your Obsidian vault. -Toolbox receives events from all MCP servers launched by Toolbox. Use the `toolbox_events` package to send events to the daemon: +**Note:** This is just an example, the actual events available from Slack may differ. + +#### Step 1: MCP Server Emits Events + +The MCP server emits an event when you are mentioned in a Slack message: ```python +# Slack MCP server emits events with message data from toolbox_events import send_event -# Send an event when something happens send_event( - name="file_processed", - data={"filename": "document.pdf", "pages": 10} + name="message.mentioned", + data={ + "channel": "engineering", + "author": "Jane Doe", + "message": "Hey @you, can we review the API design?" + } ) ``` @@ -84,39 +87,117 @@ Each event automatically includes: - `source` - The name of the MCP server that sent the event - `timestamp` - The time the event was sent -### Receiving Events in Trigger Scripts +#### Step 2: Create a Trigger Script -Toolbox automatically sends events to trigger scripts that are registered to listen for them. Scripts receive all matching events: +Create a script that receives and processes these events, appending each mention to a markdown file in your Obsidian vault: ```python +# save_slack_to_obsidian.py from toolbox_events import get_events +from pathlib import Path + +OBSIDIAN_VAULT = Path.home() / "ObsidianVault" +MENTIONS_FILE = OBSIDIAN_VAULT / "slack_mentions.md" -# Get all events for this trigger events = get_events() for event in events: - print(f"{event.name}: {event.data}") + if event.name == "message.mentioned": + # Using automatic event.timestamp and custom data fields + content = ( + f"- [{event.timestamp}] " + f"**{event.data['author']}**: " + f"{event.data['message']}\n" + ) + with open(MENTIONS_FILE, "a") as f: + f.write(content) ``` -### Creating Event-Based Triggers +!!! note +`get_events()` returns only unprocessed events that match the trigger's registered event names and sources. Once consumed, events won't be received again in subsequent trigger runs. -Use the `trigger add` command to create triggers that respond to specific events. +#### Step 3: Register the Trigger -Example: Create a trigger that responds to file events from the `obsidian-mcp` server: +Register the trigger to listen for `message.mentioned` events from the Slack MCP server: ```bash tb trigger add \ - --name "obsidian-event-processor" \ - --script "/path/to/your/script.py" \ - --event "file.created" \ - --event "file.modified" \ - --event "file.deleted" \ - --event-source "obsidian-mcp" + --name "slack-to-obsidian" \ + --script "save_slack_to_obsidian.py" \ + --event "message.mentioned" \ + --event-source "slack-mcp" ``` -#### Event Filtering +### Event Filtering Options -- **Multiple events/sources**: Provide `--event` and `--event-source` multiple times to listen for multiple events from multiple sources +When registering event-based triggers, you can control which events to receive: + +- **Multiple events/sources**: Provide `--event` and `--event-source` multiple times - **All sources**: Omit `--event-source` to listen for events from all sources - **All events from a source**: Omit `--event` to listen for all events from specific sources -- **Schedule-only**: Omit both `--event` and `--event-source` to run only on schedule without listening for events +- **Schedule-only**: Omit both `--event` and `--event-source` to run only on schedule + +Example with multiple events: + +```bash +tb trigger add \ + --name "obsidian-processor" \ + --script "process_files.py" \ + --event "file.created" \ + --event "file.modified" \ + --event "file.deleted" \ # (1)! + --event-source "obsidian-mcp" # (2)! +``` + +1. You can specify multiple `--event` flags to listen for multiple event types + +2. You can specify multiple `--event-source` flags to listen to events from multiple MCP servers + +## Managing Triggers + +### List All Triggers + +```bash +tb trigger list +``` + +### Show Trigger Status + +View the status and last 5 executions of a trigger: + +```bash +tb trigger show github-trending -n 5 +``` + +### Remove a Trigger + +```bash +tb trigger uninstall "github-trending" +``` + +## API Reference + +### Sending Events (MCP Servers) + +MCP servers can send events using the `toolbox_events` package: + +```python +from toolbox_events import send_event + +send_event( + name="file_processed", + data={"filename": "document.pdf", "pages": 10} +) +``` + +### Receiving Events (Trigger Scripts) + +Trigger scripts receive events using `get_events()`: + +```python +from toolbox_events import get_events + +events = get_events() +for event in events: + print(f"{event.name}: {event.data}") +``` diff --git a/mkdocs.yml b/mkdocs.yml index ce756a6..dbed39d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,6 +16,7 @@ theme: - navigation.sections - navigation.expand - content.code.copy + - content.code.annotate palette: - media: "(prefers-color-scheme: light)" scheme: default @@ -71,3 +72,5 @@ markdown_extensions: - admonition - toc: permalink: true + - attr_list + - md_in_html From c850886198cbe5240e3a966ebc7fd3228f8fbcbb Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Fri, 29 Aug 2025 15:13:13 +0200 Subject: [PATCH 12/14] fix admonitions --- docs/index.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/index.md b/docs/index.md index 79d101b..7ff2f08 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,3 @@ -!!! warning "Beta Documentation" -These docs are in beta and subject to change. Please refer to the [README.md](https://github.com/OpenMined/toolbox/blob/main/README.md) for the latest information. - # Toolbox [![PyPI version](https://badge.fury.io/py/syft-toolbox.svg)](https://badge.fury.io/py/syft-toolbox) @@ -10,8 +7,6 @@ These docs are in beta and subject to change. Please refer to the [README.md](ht A privacy-first tool to install MCP servers and background agents for your personal data. - - ## Overview Toolbox is a CLI tool for installing and managing [MCP](https://github.com/modelcontextprotocol/python-sdk) servers and background agents, **made for developers**. From 9e753dca3cbfe0dac21284a152cb5733f2d4e559 Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Fri, 29 Aug 2025 15:16:52 +0200 Subject: [PATCH 13/14] fix admonitions --- docs/features/triggers.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/features/triggers.md b/docs/features/triggers.md index 13e57eb..68df16f 100644 --- a/docs/features/triggers.md +++ b/docs/features/triggers.md @@ -114,7 +114,8 @@ for event in events: ``` !!! note -`get_events()` returns only unprocessed events that match the trigger's registered event names and sources. Once consumed, events won't be received again in subsequent trigger runs. + + `get_events()` returns only unprocessed events that match the trigger's registered event names and sources. Once consumed, events won't be received again in subsequent trigger runs. #### Step 3: Register the Trigger From 81fab72b5d522f6ee3e2ea437905e09bac553951 Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Fri, 29 Aug 2025 15:23:11 +0200 Subject: [PATCH 14/14] fix README --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b4533be..fc96b1c 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Toolbox is a cli tool for installing and managing [MCP](https://github.com/model ## TOC +- [Documentation](https://openmined.github.io/toolbox/) - [Use cases](#use-cases) - [Installation](#install) - [CLI](#toolbox-cli) @@ -122,11 +123,11 @@ tb log # Triggers -Toolbox can run scripts on a schedule to automate tasks in your MCP pipeline. See the [triggers documentation](docs/features/triggers.md) for setup and usage instructions. +Toolbox can run scripts on a schedule to automate tasks in your MCP pipeline. See the [triggers documentation](https://openmined.github.io/toolbox/latest/features/triggers/) for setup and usage instructions. # Notifications -Send notifications from your triggers and MCP servers using ntfy.sh. See the [notifications documentation](docs/features/notifications.md) for configuration and usage. +Send notifications from your triggers and MCP servers using ntfy.sh. See the [notifications documentation](https://openmined.github.io/toolbox/latest/features/notifications/) for configuration and usage. ## Troubleshooting screenpipe