All plugins

index-search

Search one index you run and watch one saved query, with index_search, index_health and index_watch. It searches a Meilisearch server you run, so notes or local files can be found only after you index them there; it does not search files on disk itself. Disclosure — Sends MEILI_API_KEY as a Bearer token to your MEILI_HOST. Over plain http that key travels unencrypted, and a master or admin key is sent as given, so use a search-only key. The tools are on for every surface, including gateways: anyone you allow on your Hermes gateway can search with your key. Turn a surface off with hermes tools. On Hermes 0.21.6 and later, while the plugin is enabled, its skill adds one line to the skills index of every session, including surfaces where the tools are turned off. index_watch save stores one query and prints a hermes cron create line for every 15 minutes. You run that line. A run is a model turn, and a tool call is another model request, with no daily cap. The watch covers only the first 20 hits. The job stays after uninstall until you run hermes cron remove, with -p and the profile name when the profile is not default. This plugin does not create or remove the cron job and it does not ask. Writes use the guard in agent.file_safety. An update can stop the watch.

TakeshiTGALToolsv0.1.4Updated 9 days ago

About

Search one index you run and watch one saved query, with index_search, index_health and index_watch. It searches a Meilisearch server you run, so notes or local files can be found only after you index them there; it does not search files on disk itself. Disclosure — Sends MEILI_API_KEY as a Bearer token to your MEILI_HOST. Over plain http that key travels unencrypted, and a master or admin key is sent as given, so use a search-only key. The tools are on for every surface, including gateways: anyone you allow on your Hermes gateway can search with your key. Turn a surface off with hermes tools. On Hermes 0.21.6 and later, while the plugin is enabled, its skill adds one line to the skills index of every session, including surfaces where the tools are turned off. index_watch save stores one query and prints a hermes cron create line for every 15 minutes. You run that line. A run is a model turn, and a tool call is another model request, with no daily cap. The watch covers only the first 20 hits. The job stays after uninstall until you run hermes cron remove, with -p and the profile name when the profile is not default. This plugin does not create or remove the cron job and it does not ask. Writes use the guard in agent.file_safety. An update can stop the watch.

index-search

Search one index you run, and watch one saved query for new ids on the first page.

First request

The first call does not need an API key and does not save a watch.

  1. hermes plugins install TakeshiTGAL/hermes-plugin-index-search --enable
  2. Set MEILI_HOST to the origin, such as http://127.0.0.1:7700. A search-only MEILI_API_KEY is not required for this first call.
  3. The Meilisearch server is already running.
  4. Ask "is the search server up". The model calls index_health with no arguments. That call does not ask for approval. A search needs index, q, and id_field on index_search. Saving a watch query is a later step. This plugin does not ask.

The first call is index_health with no arguments. 日本語: 最初は引数なしの index_health。検索は index と q と id_field。見張りは後で、このプラグインは聞かない。

The product name is index-search. The toolset is index_search. The tools are index_search, index_health, and index_watch. There is no slash command and no CLI. The plugin does not ship a search engine and does not call /mcp. It does not register a hook. register does not import tests.

Tools are on for every Hermes surface, including the gateway, until you turn a surface off with hermes tools. There is no separate user list. Anyone you allow on the gateway can search with your key. hermes tools does not disable a slash command, because this plugin has none.

index_search, index_health, and index_watch do not ask for approval. This plugin does not read yolo, approvals off, cron, -q, or unattended. Those are Hermes's own gate, and this plugin never returns an approve line. Requires Hermes >=0.21.6. An index uid such as movies_en_us and an id field such as created_at_id are stored unchanged. The printed cron line is not truncated.

Skill

The plugin registers one skill, meilisearch-index. It tells the model to look up index_search, index_health, and index_watch with tool_search, in English, before it tries web_search. The skill runs nothing and sends nothing by itself.

This plugin requires Hermes >=0.21.6. While the plugin is enabled, the skill adds one line to the skills index of every session. That includes a surface where the tools were turned off with hermes tools: the line stays there, and the calls are simply unavailable. There is no separate user list for the skill; every session that loads the plugin can read it. hermes plugins disable index-search removes the skill and the tools together. A cron job you already created stays until you run hermes cron remove <id>.

What you configure

MEILI_HOST is required. It is an origin: http or https, a host, and an optional port. There is no default host. A userinfo, path, query, or fragment is refused before HTTP. Plain http is allowed. Over plain http, MEILI_API_KEY is sent unencrypted.

MEILI_API_KEY is sent only as Authorization: Bearer on POST /indexes/{uid}/search. Use a search-only key. A master or admin key in that variable is still sent with the search. GET /health sends no key, even when the variable is set. No other route is called. Redirects (301, 302, 303, 307, 308) are not followed. A proxy set in the environment is not used, so the key is not sent to it. A response body over 2,000,000 bytes is not accepted. An IPv6 host keeps its brackets.

index_search takes index, q, id_field, and an optional title_field. An empty or whitespace-only query is refused before HTTP, because the server treats an empty q as a match of every document. q is at most 400 characters. The index uid is 1 to 64 letters, digits, hyphens, or underscores. The reply is the id and, when you name title_field, a title of at most 200 characters. The rest of the hit is not returned. 1 and "1" stay distinct ids. You name the id field, because displayed attributes can hide the primary key. A hit without a usable id is not a successful page.

The search body sends limit 20. A successful reply includes estimatedTotalHits. Only the first 20 hits are watched. When that total is over 20, matches past the page are never reported. save says so, and a quiet watch reports it with notify true, starting with the baseline, so the warning reaches the delivery target instead of being dropped as a quiet round. While the total stays over 20 that quiet warning repeats once a day. A check that reports new ids includes the same warning every time. It starts again when the total falls to 20 or fewer and rises past 20 later. If the page shares no saved id and the total is over 20, the result says matches between them may have been missed. save itself does not search. A page whose hits array has more than 20 objects does not advance seen ids. Each read stops if no data arrives for 30 seconds. There is no total deadline for one run. The index uid must be a string. A number or a boolean is refused before HTTP and is not saved.

Watch

index_watch actions are save, status, and check. schedule and unschedule do not create or remove a cron job. One watch. save does not search and does not create a cron job. It stores the index, query, id field, and optional title field in the state file, and it prints the hermes cron create line and does not delete the job. A cron child reads that file. It does not read config_schema.

You create the job. The printed line runs every 15 minutes and uses --deliver local. There is no daily cap in this plugin. If you do not stop it, that is 96 runs a day. Each run is a model turn. A turn that calls a tool is another model request. After hermes plugins remove, the job stays until you run hermes cron remove <id>. When the profile is not default, put -p <name> before the subcommand: hermes -p <name> cron remove <id>.

Seen ids advance only when check is a proven cron run and Hermes is not isolating this plugin. The cron session marker is cron.execution_identity.current_cron_execution (Hermes 0.21.6). This plugin does not read tools.approval_context._is_cron_approval_context. A manual index_search, including one made from cron, does not write seen ids. A manual check does not write them either, and when it lists ids it says this call did not write seen ids. The plugin cannot force the cron model to call check, and it cannot force the model's wording. If the model calls index_search, the cursor does not move.

The first successful cron check saves a baseline and does not report that page as new. A manual check while that baseline is still pending does not save it, and it does not say that it did. Later checks report ids that are not in the seen set. 500 ids are kept. Older ids drop off and can look new again. Real 0 hits, an empty hits array with estimatedTotalHits 0, does not clear the seen set. An empty hits array with a larger total is an unusable page, and seen ids are not advanced. An empty body is an incomplete search, not zero hits. The first time a non-empty page becomes 0 hits, the result says This page has 0 hits. Seen ids were kept. Repeats stay quiet until the page is non-empty again. The result does not say there is nothing new.

A failed search is not a change to the index. The same failure is reported on the first check, when the cause changes, again after 24 hours, and once when the search works again. Argument errors are not counted as that failure. When the cron session marker cannot be read, or Hermes isolates this plugin (HERMES_PLUGIN_HOST_PROCESS set to a value other than empty or 0), check does not call the server, does not advance seen ids, and writes nothing. In that form a cron run and a hand-typed check look the same, so the failure clock is not moved: a check you run by hand cannot silence the next cron report. The result is reported on every check, which is every 15 minutes while the watch is scheduled, until the form is fixed. save still writes the local query in that form. It does not search. An unset value is normal on Hermes v0.21.4, and search and health still run.

Changing the index, query, or id field asks for a new baseline on the next successful check. A failed save does not clear seen ids. Changing only the title field keeps seen ids. The save result names the title field, or (none) when it is empty. An omitted title field keeps the previous one. schedule and unschedule leave the file unchanged. A stored job id from an older version is kept and named. This plugin does not call get_job or remove_job, so it does not say the job is gone and it does not say this call removed it.

Delivery is not a tool argument. The printed command puts --deliver local on hermes cron create. You can change that flag on the command you run. cli, cron, api_server, and bot-chat are not accepted as arguments of this plugin.

When the active Hermes profile is not default, the printed create and remove lines put -p <name> before the subcommand. The profile is the name register read from ctx.profile_name. If the profile name cannot be read, the result says profile unknown and does not print a default-profile command. This plugin does not take -p or --profile as its own argument.

Where state is stored

<HERMES_HOME>/plugin-data/index-search until you delete that directory. There is no fallback to ~/.hermes. Writes go through Hermes's write check with the destination path only, then an atomic replace. If that check cannot be loaded, nothing is written. If a cron check reads a page and the watch file cannot be written, seen ids are not advanced, and the result says the page was read but the file was not written. If save cannot write the file, no cron job is created, because this plugin does not create one, and the result says the file was not written. It does not say the search failed. A corrupt state file is not overwritten. The API key is not written to the state file, the URL, or the error text. The tool result also drops the key, including the form JSON uses when the key contains a quote or a backslash, so a hit id or title that contains the key is not returned.

The job prompt tells the model that a quiet check, notify false, must reply with exactly [SILENT].

This plugin reads these Hermes names. If one cannot be loaded, raises, or no longer has that name, the watch fails closed. The profile name is not in this list. register reads ctx.profile_name.

  • plugins.plugin_storage.plugin_data_dir
  • cron.execution_identity.current_cron_execution
  • agent.file_safety.get_write_denied_error

Imports are flat only when __package__ is empty. Tests ship beside the plugin and are not loaded as the plugin.

Server behavior that was checked

Checked on 2026-10-08 against a local Community Edition image getmeili/meilisearch:v1.12 (package 1.12.8). That build's license is MIT. Enterprise sharding is not used. This plugin does not ship the engine. Your server is not described as MIT.

On that build, a search did not enqueue a task. An empty q matched every document. Displayed attributes can omit the primary key from hits. A missing key was HTTP 401. A bad key was HTTP 403. A missing index was HTTP 404. The default keys observed were two (search, and admin), not four.

The server can send anonymous telemetry until the operator turns it off. On the tested 1.12.8 image, an empty MEILI_NO_ANALYTICS value failed to start the process, because --no-analytics required a value. Setting MEILI_NO_ANALYTICS=true disabled anonymous telemetry. This plugin does not set that variable. If the host bills for search, those calls spend that account. A self-hosted Community Edition has no fee from this plugin.

What was not tested

  • index_watch was called through real Hermes cron runs with a stand-in model on 0.21.4 and current main. index_search and index_health were called through Hermes's tool dispatch only. No live model chose any of them in a chat.
  • Meilisearch Cloud was not used. If that host bills for search, the account is the host's.
  • Builds other than the image above, Enterprise binaries, a mustRestart health body, and the four default keys described in the current docs were not observed here.
  • Attribute names are refused only when they contain ., /, or a control character. The server's full attribute grammar was not copied.
  • The plugin cannot stop a cron model from calling index_search.
  • The plugin does not turn engine telemetry off.

An empty HERMES_HOME scan with Hermes v0.22.2 and with origin-main is Verdict: SAFE, 16 findings, Decision: ALLOWED — Allowed (community source, safe verdict). The findings are a test key constant, git and recall subprocess calls in the tests, and example loopback addresses in this file, the next-step text, and the tests. They stay, because the setup example and the tests need them.

manifest_version is 2. requires_hermes is >=0.21.6. The plugin version is 0.1.4. The license of this plugin is MIT. Dependencies are the Python standard library only.

README from the reviewed commit a8d5221; it updates when the author re-pins.

More by TakeshiTGAL

30 plugins by TakeshiTGAL in the catalog.

TakeshiTGALjp-subsidiesJapanese subsidy search and weekly watch, built on the jGrants public API. Disclosure — Searches api.jgrants-portal.go.jp with no API key and no daily request cap; each call waits at most 60 seconds and retries at most twice, and a result is a search match, not proof that every subsidy came back. The plugin has no user list of its own: anyone you allow on your Hermes gateway can call these tools and change this profile's watch, and the agent can set up a watch by itself. In a Chatwork room listed in CHATWORK_ROOMS, everyone can call them while CHATWORK_ALLOWED_USERS is unset. The tools are on for every platform, including gateways; turn them off per platform with hermes tools. While the plugin is enabled, its skill adds one line to the skills index of every session, including surfaces where the tools are turned off. The /subsidies command is outside hermes tools; limit it with allow_admin_from or user_allowed_commands, or disable the plugin. The optional weekly watch is an unattended cron job that runs a script with no model call and is not a sandbox; delivering it to bot-chat instead runs one model turn on the fetched text. If delivery fails after the script runs, those subsidies are already marked seen and the text stays under cron/output/. Uninstall leaves the cron job, scripts/jp-subsidies-weekly-*.py and plugin-data/jp-subsidies/ until you run hermes cron remove and delete the files. The plugin does not store the name or ID of who asked. Not tested against a live gateway, with the Chatwork plugin loaded, or for result sets of several hundred rows.Communitytools1TakeshiTGALwyoming-voice-bridgeWyoming speech-to-text and text-to-speech for a Wyoming server you run (stt/tts provider `wyoming`), plus a wyoming_voice_status tool that lists the server's models and voices. Disclosure — Audio and text to speak go to the WYOMING_* host:port you set over cleartext, unauthenticated TCP (public addresses accepted). Once selected, the providers send speech in every session, including cron and webhooks. This build imports the installed package only when its file tree is the official wyoming 1.5.4 wheel, and a different tree sends nothing. This build lists no ffmpeg digest, so audio that is not already 16 kHz, 16-bit, mono WAV is not converted. wyoming_voice_status asks with one public pre_tool_call line. Choosing always stores one command_allowlist line for that same which and the same host:port list. A later call skips the question only when a person is present. cron, hermes -q, webhook, msgraph_webhook, and api_server do not send a describe, even after always. yolo and approvals off skip the prompt, and this plugin does not add a refusal for those modes. The plugin does not import Hermes approval, config, or write-guard modules. Hermes 0.21.4 does not list the skill. The v0.21.5 canary and Hermes 0.22.2 add one skill line to every session that loads the plugin, including a surface where the tools are turned off. The status tool is on for every surface, including the gateway, and a guest there can call it and approve it when a person can answer. Turn the wyoming_voice toolset off per surface with hermes tools.Communityvoice1TakeshiTGALauthor-feedEach watch run costs 0 tokens, and the unmanned run holds no tools. Read one public profile and watch one account, with profile_get, author_feed and author_watch. It reads public posts and profiles from the Bluesky social media network, which is built on the AT Protocol (atproto), without signing in. Disclosure — HTTPS GET only to public.api.bsky.app, no API key. Hermes starts the watch Python when the cron job fires. The tools are on for every surface, including gateways, and ask for no approval: anyone you allow on your gateway can call them. Turn a surface off with hermes tools. While the plugin is enabled, its skill adds one line to the skills index of every session, including surfaces where the tools are turned off. hermes author-feed schedule writes a script and creates one cron job that does not call a model. Each run costs 0 tokens and has no daily cap. Empty script output sends nothing. Delivered to local unless you pass --deliver, so no chat by default. Run hermes author-feed unschedule before removal. That removes the job and the script. A leftover job after the plugin is gone stops with hermes cron remove <id>. The scheduled script does not run under plugins.isolation: host, so that setting does not stop the watch. The author_watch tool still refuses a run that is not the saved cron job, including under plugins.isolation: host, and posts that notice on every run of the tool. The first run only records what is already there. One run reads at most the latest 3 pages and announces a new post by this account on them. When every row on those pages is new, with no saved post or mark, and the feed still offers another cursor, it also posts a possible-miss notice, at most once in 24 hours while that keeps happening. Replies, including the account's own thread continuations, are not announced. It relies on private Hermes parts, so an update can stop it. State stays in <HERMES_HOME>/plugin-data/author-feed after uninstall. Seen post URIs advance only on the saved cron job after a successful fetch. The script allows that when cron/executions.db shows that job running under the parent pid and cron/jobs.json names author-feed-watch.py. A direct run and another cron job exit 3 with no GET and no write. The author_watch tool allows that only for the saved job id. Delivery accepts origin, local, all, bot-chat, the Hermes 0.21.6 cron platform names, and public registry names that declare a cron delivery env var. A refused name can be set with hermes cron edit <id> --deliver. bot-chat places the watched account's post text in another model turn that has the profile's tools. hermes cron create cannot set a per-job tool list. A job made by 0.1.x keeps its model turn until the next schedule. On Hermes 0.21.4 and 0.21.5 this plugin does not load, and a leftover job keeps its model turn until hermes cron remove <id>. Running schedule again updates the interval and deliver target and switches an existing model job to the script.CommunitytoolsTakeshiTGALcsharp-game-editorGive it one feature for the Unity project open in your editor, and it builds the scripts, objects and scene in one plan, stops that plan when the compile reports an error CS line, and plays the scene when the compile is clean. Disclosure — Needs MCP for Unity pinned to v10.3.0, plus git and uv. Hermes starts mcpforunityserver==10.3.0 through uvx with telemetry and the update check off. Disk reads run at once. apply_plan asks once and puts back a file the plan did not name. A plan that deletes, runs editor code, can lose unsaved work or writes outside the project asks again, and that summary is sent only when every line fits the approval card; otherwise nothing is sent and confirm_risky_plan asks. unity_docs sends the query to docs.unity3d.com after Hermes asks. unity_generate can call paid providers you configured in MCP for Unity; that call was not part of the check. Tools are on by default on every surface, including the gateway. Only users the gateway admits can reach the tools, and this plugin keeps no user list of its own. Cron and a session with nobody to answer decline. Logs stay in <HERMES_HOME>/plugin-data/agent-plugin-csharp-game-editor-<hash>/logs. Stop with hermes plugins disable csharp-game-editor, or hermes tools for one surface. macOS only.Communitytools