{"id":25279990,"url":"https://github.com/skissue/llm-tool-collection","last_synced_at":"2026-02-03T13:03:58.593Z","repository":{"id":273251712,"uuid":"919087436","full_name":"skissue/llm-tool-collection","owner":"skissue","description":"Crowdsourced collection of tools for LLMs in Emacs","archived":false,"fork":false,"pushed_at":"2025-11-22T20:51:12.000Z","size":33,"stargazers_count":70,"open_issues_count":2,"forks_count":8,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-11-22T22:17:00.380Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/skissue.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-01-19T17:15:13.000Z","updated_at":"2025-11-22T20:49:38.000Z","dependencies_parsed_at":"2025-01-19T19:42:18.913Z","dependency_job_id":"d982b6a1-f25d-436a-bca5-f0fddff2c47c","html_url":"https://github.com/skissue/llm-tool-collection","commit_stats":null,"previous_names":["skissue/llm-tool-collection"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/skissue/llm-tool-collection","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skissue%2Fllm-tool-collection","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skissue%2Fllm-tool-collection/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skissue%2Fllm-tool-collection/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skissue%2Fllm-tool-collection/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/skissue","download_url":"https://codeload.github.com/skissue/llm-tool-collection/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skissue%2Fllm-tool-collection/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29046503,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T10:09:22.136Z","status":"ssl_error","status_checked_at":"2026-02-03T10:09:16.814Z","response_time":96,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-12T18:07:08.073Z","updated_at":"2026-02-03T13:03:55.448Z","avatar_url":"https://github.com/skissue.png","language":"Emacs Lisp","funding_links":[],"categories":[],"sub_categories":[],"readme":"#+title: LLM Tool Collection\n#+author: Ad \u003cme@skissue.xyz\u003e\n\nA crowdsourced collection of tools to empower Large Language Models in Emacs.\n\n* Table of Contents\n:PROPERTIES:\n:TOC:      :include all :depth 2 :force (nothing) :ignore (this) :local (nothing)\n:END:\n:CONTENTS:\n- [[#installation][Installation]]\n- [[#usage][Usage]]\n- [[#tool-list][Tool List]]\n  - [[#filesystem][Filesystem]]\n  - [[#buffers][Buffers]]\n  - [[#search][Search]]\n  - [[#system][System]]\n- [[#contributing][Contributing]]\n  - [[#faster-iteration][Faster Iteration]]\n:END:\n\n* Installation\n:PROPERTIES:\n:CUSTOM_ID: installation\n:END:\nThis package is not yet in any repositories. Install it with your favorite from-Git method!\n\nQuick and dirty: clone the repository and add it to ~load-path~.\n#+begin_src elisp\n  (add-to-list 'load-path \"/path/to/llm-tool-collection/\")\n  (require 'llm-tool-collection)\n#+end_src\n\n* Usage\n:PROPERTIES:\n:CUSTOM_ID: usage\n:END:\nQuick and dirty: register every tool.\n#+begin_src elisp\n  ;; For gptel:\n  (mapcar (apply-partially #'apply #'gptel-make-tool)\n          (llm-tool-collection-get-all))\n\n  ;; For llm:\n  (mapcar (apply-partially #'apply #'llm-make-tool)\n          (llm-tool-collection-get-all))\n#+end_src\n\nEvery tool is defined with a symbol =llm-tc/tool-name= that has both a variable value and a function value. The variable value contains the tool specification, which can be passed to any compliant Emacs LLM client. The function value contains the function that runs the given tool. This can be instrumented or run manually.\n\nTo register just one tool:\n#+begin_src elisp\n  ;; For gptel:\n  (apply #'gptel-make-tool llm-tc/list-directory)\n\n  ;; For llm:\n  (apply #'llm-make-tool llm-tc/list-directory)\n#+end_src\n\nUse ~llm-tool-collection-get-category~ to map over a list of tools pertaining to a specific task.\n#+begin_src elisp\n  ;; For gptel:\n  (mapcar (apply-partially #'apply #'gptel-make-tool)\n          (llm-tool-collection-get-category \"filesystem\"))\n\n  ;; For llm:\n  (mapcar (apply-partially #'apply #'llm-make-tool)\n          (llm-tool-collection-get-category \"filesystem\"))\n\n#+end_src\n\nUse ~llm-tool-collection-get-tag~ to map over a list of tools with a specific tag.\n#+begin_src elisp\n  ;; For gptel:\n  (mapcar (apply-partially #'apply #'gptel-make-tool)\n          (llm-tool-collection-get-tag 'editing))\n\n  ;; For llm:\n  (mapcar (apply-partially #'apply #'llm-make-tool)\n          (llm-tool-collection-get-tag 'editing))\n#+end_src\n\nSee [[#tool-list][Tool List]] for a list of tool names, descriptions, and categories.\n\n* Tool List\n:PROPERTIES:\n:CUSTOM_ID: tool-list\n:END:\n** Filesystem\n:PROPERTIES:\n:CUSTOM_ID: filesystem\n:END:\n*** read-file\n+ Author :: @skissue\n+ Tags :: filesystem, editing\n\nAllows the LLM to open a file and read its contents.\n\n*** list-directory\n+ Author :: @skissue\n+ Tags :: filesystem\n\nAllows the LLM to list the contents of a directory.\n\n*** create-file\n+ Author :: @skissue\n+ Tags :: filesystem, editing\n\nAllows the LLM to create a new file with specified content. Returns an error if the file already exists.\n\n*** create-directory\n+ Author :: @skissue\n+ Tags :: filesystem\n\nAllows the LLM to create a new directory. Returns an error if the directory already exists.\n\n*** view-file\n+ Author :: @ultronozm\n+ Tags   :: filesystem, editing, introspection\n\nViews the contents of a file.  Optional /offset/ and /limit/ let you show a slice of lines.\n\n*** edit-file\n+ Author :: @ultronozm\n+ Tags   :: filesystem, editing\n\nReplaces **exactly one** occurrence of a string in a file with a new string.\n\n*** glob\n+ Author :: @ultronozm\n+ Tags   :: filesystem, search\n\nExpands a Unix‑style glob pattern (e.g. =*.el=) and returns the matching paths.\n\n*** replace-file\n+ Author :: @ultronozm\n+ Tags   :: filesystem, editing\n\nCompletely overwrites a file with the supplied content.\n\n*** ls\n+ Author :: @ultronozm\n+ Tags   :: filesystem\n\nLists directory contents, with optional regexps to ignore.\n\n** Buffers\n:PROPERTIES:\n:CUSTOM_ID: buffers\n:END:\n*** view-buffer\n+ Author :: @ultronozm\n+ Tags   :: buffers, editing, introspection\n\nAllows the LLM to view the contents of a buffer. The LLM can optionally specify a line offset to start from, as well as a limit on the number of lines to return.\n\n*** edit-buffer\n+ Author :: @ultronozm\n+ Tags   :: buffers, editing\n\nReplaces **exactly one** occurrence of a string in a buffer.\n\n*** replace-buffer\n+ Author :: @ultronozm\n+ Tags   :: buffers, editing\n\nOverwrites an entire buffer with new content.\n\n*** buffer-search\n+ Author :: @ultronozm\n+ Tags   :: buffers, search, introspection\n\nRegex search inside a buffer; returns matching line numbers plus text.\n\n*** list-buffers\n+ Author :: @ultronozm\n+ Tags   :: buffers, introspection\n\nLists user‑relevant buffers, excluding internal/temp buffers.\n\n** Search\n:PROPERTIES:\n:CUSTOM_ID: search\n:END:\n*** grep\n+ Author :: @ultronozm\n+ Tags   :: filesystem, search, system\n\nRecursive =grep -E= with line numbers.  Supports /include/ glob and /path/ root.\n\n** System\n:PROPERTIES:\n:CUSTOM_ID: system\n:END:\n*** bash\n+ Author :: @ultronozm\n+ Tags   :: system, execution\n\nRuns an arbitrary Bash command and returns its standard output (errors if exit is nonzero).\n\n* Contributing\n:PROPERTIES:\n:CUSTOM_ID: contributing\n:END:\nContributions to this project are welcome and encouraged! After all, this collection can't be crowdsourced if there's no crowd 🙃.\n\nTo write a new tool, use the ~llm-tool-collection-deftool~ macro. For details on its usage, see its docstring as well as the existing tools.\n\n#+begin_src elisp\n  (llm-tool-collection-deftool read-file ; Tool name\n    ;; Specs\n    (:category \"filesystem\" :tags (filesystem editing) :confirm t :include t)\n    ;; Arguments, with LLM-friendly documentation and types\n    ((path \"Path to the file to read. Supports relative paths and '~'.\"\n           :type string))\n    ;; LLM-friendly tool documentation\n    \"Read the contents of a file and return its content as a string.\"\n    ;; Implementation body\n    (with-temp-buffer\n      (insert-file-contents (expand-file-name path))\n      (buffer-string)))\n#+end_src\n\nIt's highly recommended to include ~:tags~, as well as appropriate values for the ~:confirm~ and ~:include~ parameters, depending on how dangerous the tool may be. Additionally, docstrings should be as LLM-friendly; consider instructing models on when to call a tool, and what tools it may want to chain together.\n\nAfter defining a tool, make sure to add it to the README! Use the existing documentation structure as an example.\n\nFor non-trivial/complex tools, it's recommended to include a short screencast or demo of the tool in action. If able to test, also consider adding a note on which models tend to perform the best with the tool.\n\nWhen ready, submit a PR!\n\n** Faster Iteration\n:PROPERTIES:\n:CUSTOM_ID: faster-iteration\n:END:\nThere will likely be many iterations necessary to get a tool to a good state. To speed up the feedback loop, functions to immediately update the tools in an LLM interface can be added to ~llm-tool-collection-post-define-functions~. For example, to immediately add (or re-add) a tool to [[https://github.com/karthink/gptel/][gptel]] upon re-evaluating the definition:\n\n#+begin_src elisp\n  (defun llm-tool-collection-register-with-gptel (tool-spec)\n    \"Register a tool defined by TOOL-SPEC with gptel.\n  TOOL-SPEC is a plist that can be passed to `gptel-make-tool'.\"\n    (apply #'gptel-make-tool tool-spec))\n\n  (add-hook 'llm-tool-collection-post-define-functions\n            #'llm-tool-collection-register-with-gptel)\n#+end_src\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskissue%2Fllm-tool-collection","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskissue%2Fllm-tool-collection","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskissue%2Fllm-tool-collection/lists"}