mcp-bridge
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-bridgeturn on the LED on garage-pi"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ctrlPi MCP Bridge
An MCP (Model Context Protocol) server that lets an AI agent (e.g. Claude Desktop) control one or more GPIO agents through an ordinary conversation, by calling their REST API over HTTP.
Runs on a Mac, a Raspberry Pi, or any Linux box, secured with API key authentication, zero npm dependencies.
Looking for the GPIO servers themselves, or Apple HomeKit and Google Home? See the Related projects below.
This app acts as a pure API proxy. It is a thin MCP front-end: every tool targets an agent and proxies the request to that agent's REST endpoints, forwarding that agent's own Api-Key.
[MCP client: Claude Desktop / mcp-remote]
│ MCP (STDIO or Streamable HTTP /mcp)
▼
[mcp-bridge]
│ REST (GET/POST, Api-Key per agent)
├──────────────→ [garage-pi 192.168.1.50:8314] (pi-gpio-api)
└──────────────→ [shed-pico 192.168.1.51:8314] (pico-gpio-api)Requirements
Node.js 20 or newer, with node and npx on your PATH. If you do not have it, take the LTS build from nodejs.org. Nothing else is needed: the MCP protocol (JSON-RPC 2.0 over stdio or Streamable HTTP) is hand-rolled on Node built-ins, so the package has zero dependencies.
You also need at least one GPIO agent reachable on your LAN, a pi-gpio-api Pi or a pico-gpio-api Pico W. This bridge acts strictly as a control plane to drive them remotely.
Related MCP server: idh
Quick start, nothing to install
Let Claude Desktop fetch and start the app itself. One step directly via npx. npx fetches the published package and runs it ephemerally.
Open Claude Desktop's Settings → Developer → Edit Config, which opens ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or the equivalent file on Windows or Linux, and add the server under mcpServers:
{
"mcpServers": {
"ctrlpi": {
"command": "npx",
"args": ["-y", "@ctrlpi/mcp-bridge"]
}
}
}Restart Claude Desktop and the tools are there. Ask it what agents you have and it will call mcp_agents_list; from then on it can read pins, drive outputs, and configure the agents in plain conversation.
The first launch sweeps your local /24 and writes every agent it finds to ~/.ctrlpi/config.json. By default, newly discovered agents are recorded using their shipped default keys. (You can append --rotate-keys to the args array to automatically generate and apply a new random key to each one.)
The sweep repeats on every launch and every hour after it, which is what picks up an agent switched on later and repairs the address of one that took a new DHCP lease (a Pico nearly always does on reset). Add --no-scan to turn that off once your setup has settled, and take it out again the day something moves.
Install
Install it properly when you want to own the process, or when the bridge runs on a Pi and has to be reachable from Claude Desktop and other clients on different machines. Under npx the server lives and dies with the client that started it and is refetched as needed; installed, it stays in one place and you start and stop it yourself.
npm install @ctrlpi/mcp-bridge
cd node_modules/@ctrlpi/mcp-bridge
node server.js --httpIt listens on port 8315 on every interface, so any client on the LAN reaches it at http://<host>:8315/mcp. Set mcp.api_key before you expose it: HTTP mode is key-gated, and the first caller to connect with a key of its own claims it (see Authentication). --local keeps the listener on loopback instead.
Keep it running
HTTP mode is intended for continuous background execution; a stdio server is started and stopped by the client that owns it. To leave the HTTP transport running on a Pi without a terminal open, start it under PM2:
npm install -g pm2 # if you don't already have it
pm2 startup # no need to repeat if already done
pm2 start server.js --name mcp-bridge -- --http
pm2 save--name mcp-bridge is not optional: PM2 would otherwise name the process after the script and call it server. mcp-bridge is the name the rest of the ctrlPi tooling looks for when it manages this process. The -- is not optional either, or PM2 reads --http as one of its own flags and starts nothing.
Run
Run it with node server.js from the installation folder (node_modules/@ctrlpi/mcp-bridge), or npx -y @ctrlpi/mcp-bridge with no install at all. The arguments below are identical either way.
stdio is the default and communicates directly over standard input/output: the transport is the process's own stdin and stdout, and the client that launched it owns both. Everything the server would print goes to stderr instead, because stdout is the protocol channel. This is the mode Claude Desktop uses.
--http serves Streamable HTTP at POST /mcp on port 8315, one above the agents' own 8314, for a client that cannot launch a local process or sits on another machine. It is a server: it stays up, holds a port, and requires mcp.api_key from every caller (see Authentication).
Run flags
Flag | Effect |
(none) | Runs the stdio MCP server, the default transport. |
| Serves Streamable HTTP at |
| Binds to loopback ( |
| Explicit bind address; wins over |
| Listen port (default |
| Replace the shipped default key on any agent still using it with a random one, and record the date under |
| Never sweep the LAN, at startup or after. A first run with no config still sweeps once, since there would be no agents at all otherwise. |
| Keep both config files in this folder instead of |
Connect from Claude Desktop
For the ordinary case, where Claude Desktop launches the server itself over stdio, use the npx form under Quick start. Substitute "command": "node", "args": ["<path>/node_modules/@ctrlpi/mcp-bridge/server.js"] if you installed it instead.
To reach a bridge over the network, start it in HTTP mode first (node server.js --http), then connect through mcp-remote, passing mcp.api_key (your-mcp-key by default, see Configuration):
{
"mcpServers": {
"ctrlpi": {
"command": "npx",
"args": [
"-y", "mcp-remote", "http://<host>:8315/mcp",
"--header", "Api-Key:your-mcp-key"
]
}
}
}Pick one of the two, not both. Restart Claude Desktop after saving either.
Connect from Claude Code
Claude Code speaks both transports directly, so no mcp-remote hop is needed. Pick one.
stdio, where Claude Code launches its own copy:
claude mcp add ctrlpi -- npx -y @ctrlpi/mcp-bridgeStreamable HTTP, attaching to a bridge already running with --http:
claude mcp add ctrlpi --transport http http://<host>:8315/mcp --header "Api-Key: your-mcp-key"Authentication
Two independent keys are in play, and they are never the same one:
Key | Where it lives | What it does |
|
| Gates this server in |
|
| Each agent's own key, forwarded on every proxied REST call. Never sent to an MCP client. |
stdio mode needs no key at all: the transport is the process's own stdin/stdout, so whoever launched it already has that access.
Claiming the HTTP key
While mcp.api_key is still the shipped your-mcp-key, the first caller to present a different key claims it: that key is written to mcp-config.json with the date under mcp.key_set, and from that moment it is the only key accepted. Just connect with the secret you want to use and it becomes the secret.
This is trust on first use, so the window is exactly as safe as your network during it: whoever reaches the port first sets the key. Set mcp.api_key by hand to skip the window, and keep --http off an untrusted LAN until a key is in place. Once claimed, the key only ever changes by editing the file.
No TLS. The HTTP transport speaks plain HTTP, so
mcp.api_keytravels as plaintext. That's fine on a trusted LAN, but don't expose port 8315 directly to the internet. If you need remote access, tunnel it.--localkeeps the listener on loopback. The key is exclusively read from theApi-Keyheader, keeping it out of shell history and proxy logs.
Tools
Every tool except mcp_agents_list takes an agent argument naming an entry from the shared ~/.ctrlpi/config.json.
Tool | Description |
| List all configured agents with |
| Read a pin by number or name. Pass |
| Write |
| Configure a pin. Same fields as the agent's REST config endpoint. |
| List the GPIO pins that are currently being actively watched (emitting hardware interrupts/webhooks). |
| Scan every hardware pin (BCM 2-27 on a Pi, GP0-GP28 on a Pico). |
| Configure a named sensor. |
| Read one sensor by name, or every configured sensor merged into one object when |
| Read the agent's full config: |
| Update config fields, named ungrouped (the agent routes each into its group). Changing the agent's |
| Load a whole config onto the agent. Pass |
| Restart the agent's process. |
| Upgrade the agent in place: downloads the latest release and reinstalls dependencies, then restarts. |
| Read the last 50 lines of the agent's log. |
Tools return the agent's JSON response as text, or an Error: ... string when the agent is unknown, unreachable, or answers with an error status.
Configuration
Where the config lives: in
~/.ctrlpi/, always - never next toserver.js, however you started it. Pass--config <folder>to keep both somewhere else; they are always named the same and always sit together.
Two files. Neither ships with the package: the first run builds both from a LAN scan, so there is no template to copy.
~/.ctrlpi/config.json - the agents, shared with every other ctrlPi project:
{
"agents": [
{ "name": "garage-pi", "ip": "192.168.1.50", "port": 8314,
"api_key": "a1b2c3d4e5f60718293a4b5c", "key_set": "2026-08-20 14:23:13" },
{ "name": "shed-pico", "ip": "192.168.1.51", "port": 8314,
"api_key": "shed-pico-secret-key" }
]
}~/.ctrlpi/mcp-config.json - what only this server owns:
{
"mcp": { "api_key": "your-mcp-key" },
"agents": { "whitelist": [], "blacklist": [] }
}Field | File | Description |
|
| Secret required to reach this server in HTTP mode. Ignored in stdio mode. Starts as |
|
| When |
|
| Optional. Agent names this server may drive: a whitelist keeps only those, a blacklist drops those, both means whitelist minus blacklist, neither means all of them. Tools exclusively see agents permitted by the filter, ensuring only approved agents can be addressed. |
|
| Unique name used to target the agent in every tool call. |
|
| LAN IP or hostname of the agent's REST server. |
|
| REST port (optional, default |
|
| That agent's own |
|
| When |
Both files are re-read on every tool call, so adding, removing or re-keying an agent by hand takes effect without a restart. The filter is applied only to what tools see: discovery always saves the full shared list, so narrowing it here strictly preserves other projects' agents in the shared list.
Agent discovery
The agent list keeps itself current. Every start sweeps the local /24, and so does every hour after that, so an agent switched on later is picked up without anyone restarting anything. --no-scan turns all of it off.
Each sweep is one scan feeding three passes, in this order:
Repair the address of any agent that moved. Agents take new DHCP leases (a Pico nearly always does on reset), which otherwise breaks every call to it.
Rotate the key of anything still on the shipped default, with
--rotate-keysonly.Add whatever is left that isn't on record yet.
Repair runs first on purpose: an agent that merely moved is not a new agent, and adding it before its address is fixed would file it twice, the second time as <name>-<octet>.
Newly found agents are filed under whichever key applies. Setup decisions are made autonomously using command-line flags, accommodating MCP clients that launch the server without a console.
It still accepts the shipped default key (
your-secret-key). With--rotate-keys, a random key is written to the agent (POST /config/update), verified by reading back with it, then saved here with today's date inkey_set. Without the flag the agent is recorded on the default key, untouched.The default key is refused, so the agent already has a key of its own that this app has no way to read. It is saved without a key, requiring manual configuration of
api_key.
--rotate-keys also revisits agents already on file that are still on the default key, so adding the flag later secures a setup that was first discovered without it. It is safe to leave on permanently: an agent that already has a key of its own is never touched, which makes repeat runs a no-op.
An agent's key is only ever changed when this app can save the result, so a rotation that cannot be recorded never happens - the alternative locks that agent out of every other ctrlPi tool.
A moved agent is adopted only after the old address stops answering, and it is checked with the public default key first - its own key is only ever offered once the old address is confirmed dead, so a device that merely took a familiar name is never handed that agent's key.
If two devices answer to one name, that is reported as a possible cyber attack. When the configured address is still alive it is treated as genuine and the other is renamed on the device (only if it accepts the default key); when it is also dead, nothing is changed - there is no safe way to tell which is which.
Why no webhook listener?
mcp-bridge is an inbound control plane only; it never receives the agents' webhooks, by design:
Push can't wake the model. MCP clients invoke the server, not the other way round; a webhook arriving here couldn't start a Claude conversation, so a listener wouldn't make the AI reactive. Reactive automation is the bridges' job (
homekit-bridge:8316,matter-bridge:8317).Lifecycle. In stdio mode the server only lives while the MCP client session is open, so events outside a session would be lost.
Related projects
pi-gpio-api: Raspberry Pi GPIO REST server that reads inputs and drives outputs (and named sensors) over an HTTP API.pico-gpio-api: Raspberry Pi Pico W port of the GPIO REST server, with the same endpoints, wire format, and auth.homekit-bridge(coming soon): native Apple HomeKit bridge that exposes GPIO pins and sensors as HomeKit accessories, driven over the agents' REST API.matter-bridge(coming soon): Matter bridge that exposes GPIO pins and sensors to any Matter platform (Apple Home, Google Home, Alexa, Home Assistant), driven over the agents' REST API.ctrlpi-lab(coming soon): Web dashboard for monitoring and controlling agents over REST API and MCP.
Testing
The MCP server includes an integration test suite that runs against a mock agent. Note: running the tests requires Python 3 installed locally for the mock server (mock_agent.py).
npm testLicense
This project is licensed under the MIT License - see the LICENSE file for details.
Available Tools
14 toolsmcp_agent_logsA
Read the last 50 lines of agent's server log file.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, but it does disclose a concrete behavioral trait: the output is capped at the last 50 lines, so there is no pagination or full-log option. It omits whether the read requires permissions, where the log lives, and what happens if the log is empty or missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and the resource, and the scope limit is included inline. Nothing is wasted and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the core intent is covered, but the description does not resolve the only open question an agent has — the accepted form of the 'agent' identifier — nor the log's location or error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single 'agent' parameter, so the description must compensate. It implies the parameter identifies which agent's log to read, but gives no format guidance (name, ID, or alias), leaving the agent to guess a valid value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read'), resource ('server log file'), and an exact scope ('last 50 lines'), which no sibling covers — restart/upgrade/list are distinct operations. An agent can identify the tool's function without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'last 50 lines' framing implies a diagnostic/troubleshooting use, but the description never states when to reach for this versus mcp_agent_restart or mcp_agent_upgrade, nor any prerequisites. Usage is inferable but not directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_agent_restartA
Restart agent's server process. Pass reboot=true to reboot the physical device instead - only honored on a real Raspberry Pi; on Mac/dev agents reboot is ignored and the process is restarted as usual.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes | ||
| reboot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that this is a mutating operation and that reboot is platform-conditional (honored only on real Raspberry Pi, silently ignored on Mac/dev where a process restart occurs instead). It does not mention downtime, whether in-flight work is lost, permissions, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the primary action and immediately followed by the optional parameter's special semantics. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description should carry more: it omits what happens to the agent's connections/state during restart, whether the call waits for the process to come back, and any return or error behavior. Adequate for a simple 2-param tool but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the `reboot` boolean well, including its platform-dependent semantics and fallback behavior, but says nothing about the format or expected value of the required `agent` parameter (name vs. id).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource (restart the agent's server process) and scopes the target agent via the `agent` parameter. It is clearly distinguishable from siblings like mcp_agent_upgrade, mcp_agent_logs, or mcp_agents_list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the conditional use of reboot=true, which implicitly frames two modes of operation, but it never states when an agent should be restarted rather than upgraded or inspected via mcp_agent_logs. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_agents_listA
List configured agents (Pi or Pico). Returns name, ip, port, online (live /hello probe), type (pi/pico), version, has_default_key, and last_updated_at. Unreachable agents are included (online=false). The LAN is scanned automatically every hour (last_updated_at indicates the last scan time). You can pass rescan=true to forcefully sweep the LAN for new agents right now, but avoid doing this unless the user explicitly asks to find new hardware, as active scanning takes a long time. If has_default_key is true for any agent, explicitly tell the user they are using an insecure default key and ask if they want you to change it.
| Name | Required | Description | Default |
|---|---|---|---|
| rescan | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: unreachable agents are still returned (online=false), the LAN is auto-scanned hourly with last_updated_at as the timestamp, and rescan forces a slow synchronous sweep. It also flags the security implication of has_default_key.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and return fields, then layers on rescan guidance and the security instruction. Every sentence is load-bearing, though the security-warning directive is slightly tangential to invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description fully documents return fields and their semantics (online via live /hello probe, type pi/pico, etc.), and covers the single param, caching cadence, and cost. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (the boolean 'rescan' has no schema description), so the description must compensate, and it does: it explains what rescan=true does, its performance cost, and the condition under which it should be used. This is meaning well beyond the bare boolean type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List configured agents (Pi or Pico)') and immediately enumerates the returned fields. An agent can distinguish it from siblings like mcp_agent_restart, mcp_agent_upgrade, and mcp_agent_logs without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the rescan parameter and, crucially, when NOT to ('avoid doing this unless the user explicitly asks to find new hardware'), citing the slow scan cost as the reason. It also prescribes a follow-up action (warn the user about has_default_key).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_agent_upgradeA
Upgrade the agent in place: runs install.sh --upgrade (re-downloads the latest release files and reinstalls dependencies), then restarts the process so the new code takes effect.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the script run, the re-download of release files, dependency reinstallation, and the process restart. It stops short of consequences an operator would want, such as downtime, failure behavior, or irreversibility of the in-place upgrade.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the action front-loaded and the parenthetical reserved for mechanism detail; no filler. Slightly dense but every clause carries information about what the call actually does.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is adequate about what the tool does but incomplete about operational risk: nothing on downtime, what happens to the agent if the upgrade fails mid-way, or confirmation of success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter, 'agent', with 0% schema description coverage. The description refers to 'the agent' generically but never defines what identifier or selector the value must be, so it neither compensates for the coverage gap nor fully ignores it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Upgrade the agent in place') and goes further by naming the exact mechanism (install.sh --upgrade). An agent can tell this apart from mcp_agent_restart because the upgrade step is described, though the contrast is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb: you call it when you want the agent on the latest release. There is no explicit when/when-not guidance and no named alternative (e.g., use mcp_agent_restart for a plain restart), even though the sibling list contains a directly competing tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_config_loadA
Load a full config onto agent from a dict (the agent saves a backup first). Pass an empty dict {} to reset all settings on the agent keeping only its API key.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes | ||
| config | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses two important behavioral traits: a backup is saved first, and passing an empty dict resets settings while preserving the API key. This is valuable context beyond the schema. It does not mention permissions or what happens if the config is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main action, and the special reset behavior is clearly stated. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description provides critical behavioral context (backup, reset semantics). It is almost complete, but a brief note on return value or failure modes would improve it further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains that the config parameter is a dict and what an empty dict does, adding meaning beyond the schema type. The agent parameter is not explained, but its purpose is relatively inferable from the tool name and context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action and resource: load a full config onto an agent. It names the sibling mcp_config_read and mcp_config_write implicitly by being the operation that replaces the entire config, providing a scope distinction. However, it does not explicitly name how it differs from mcp_config_write.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage when setting a complete configuration versus partial updates, and mentions the reset case specifically. But there is no explicit guidance on when to choose this tool over mcp_config_write or other config-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_config_readB
Read agent's global application configuration, grouped: notifications (webhook + webhook_key), bridges (matter/homekit callbacks), settings (docs_enabled, logs_enabled, log_days), sensors, and configured pins (gpios). The agent block (platform, os, ip, cpu_temperature, version) is computed live on every read and is not stored.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It usefully discloses that the `agent` block is computed live on every read and not stored, which is real added context. It does not state auth requirements, side effects, or whether other groups are persisted, but for a read-only tool the risk surface is small.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence, front-loaded with the verb and resource, with the enumerated groups following. No filler, though the nested parenthetical groupings make it slightly heavy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no annotations and no output schema, the description compensates well by enumerating the config groups the caller receives and clarifying that the agent block is dynamically computed. Only the `agent` parameter's expected value remains unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One required parameter with 0% schema description coverage. The description implies `agent` selects whose configuration is read ('Read `agent`'s global application configuration'), which adds some meaning, but does not define the parameter's expected form or identifier source.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource (the agent's global application configuration) and enumerates the groups returned (notifications, bridges, settings, sensors, gpios). This is clear, but it doesn't explicitly name the sibling it differs from (config_load/config_write), so the agent must infer the read/write/load distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given versus config_load or config_write, and no prerequisites or context for calling a read are stated. The verb implies retrieval, but nothing routes the agent among the sibling config tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_config_writeA
Update agent's global configuration dynamically. These are the ungrouped (root) field names; the agent routes each into its group (webhook_url -> notifications.webhook, webhook_key -> notifications.webhook_key, docs_enabled/logs_enabled/log_days -> settings), so a read afterwards shows them nested. log_days controls how long log entries are kept (0-30, clamped; 0 clears the log immediately and keeps only the last hour). docs_enabled is Pi-only. Changing api_key changes the agent's authentication key immediately, and also updates the local config.json file to match automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| agent | Yes | ||
| api_key | No | ||
| log_days | No | ||
| webhook_key | No | ||
| webhook_url | No | ||
| docs_enabled | No | ||
| logs_enabled | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the agent-side routing (webhook_url -> notifications.webhook, etc.), that reads afterwards show nested values, that log_days is clamped 0-30 and that 0 clears the log, that docs_enabled is Pi-only, and that changing api_key immediately re-authenticates and rewrites config.json. It omits permissions/auth requirements and whether omitted fields are preserved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph, front-loaded with the core action and then the field semantics in a sensible order. It is long but nearly every clause carries information the schema does not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and 0% schema coverage, the description supplies routing, clamping rules, side effects, and platform restrictions. Remaining gaps (auth requirements, partial-update semantics, response shape) are real but modest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 8 params, so the description must compensate, and it explains the meaning and routing of webhook_url, webhook_key, docs_enabled, logs_enabled, log_days, and api_key — including value semantics and side effects. Only `name` and the `agent` target itself are left undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Update `agent`'s global configuration dynamically.' That clearly separates it from the read/load siblings (mcp_config_read, mcp_config_load), though it never explicitly names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'dynamically' and by the field-by-field explanation of what each key affects, but there is no explicit statement of when to prefer this over mcp_config_read/mcp_config_load or what prerequisites exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_gpio_configA
Configure a GPIO pin on agent by number. type: input/output/vcc/gnd/remove. init: 0/1/last. pullup: up/down/none (input only). max: max pulse duration in seconds (output only). reversed: active-low logic (input/output only). watched: trigger webhook on state change (logged on the agent if no notifications.webhook is configured).
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | ||
| gpio | Yes | ||
| init | No | ||
| name | No | ||
| type | No | ||
| agent | Yes | ||
| pullup | No | ||
| watched | No | ||
| reversed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose some behavior: 'watched' triggers a webhook and falls back to logging when notifications.webhook is unset, and 'remove' implies a destructive mode. It omits permissions required, whether reconfiguring resets existing pin state, and reversibility of a remove.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then a compact parameter reference. It is one long sentence, but nearly every clause carries information; only the trailing webhook parenthetical is slightly heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no annotations and no output schema, the description covers most parameters but skips name and never addresses the risks of the destructive 'remove' type or what the tool returns on success or failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it enumerates valid values for type, init, pullup, and documents max, reversed, and watched with their applicability constraints. It leaves agent, gpio, and name undocumented, but the two required params are at least implied by 'on `agent` by number'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (configure) plus resource (GPIO pin) and target (agent), so it is clearly distinct from gpio_read, gpio_write, and gpio_scan. It does not explicitly name a sibling to route against, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parentheticals 'input only', 'output only', and 'input/output only' give implied usage rules per parameter, which is genuinely useful. However, there is no guidance on when to prefer this over gpio_write or gpio_read, and no prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_gpio_readB
Read a GPIO pin value on agent by number or name, or 'all' to read all pins.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes | ||
| name_or_gpio | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full behavioral burden. It implies a safe read but omits whether the agent must be connected, permissions required, error behavior for an unknown pin name, and what 'all' returns — significant gaps for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that states the action, target, and accepted inputs with no filler; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-required-parameter read tool with no annotations and no output schema, the definition leaves out return shape (especially for 'all'), failure modes, and the source of the `agent` value, so an agent lacks enough to invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It usefully defines `name_or_gpio` (pin number, pin name, or the special value 'all'), which the schema cannot convey, but it never defines what `agent` accepts or where that identifier comes from.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Read a GPIO pin value") and identifies the target (`agent`), which cleanly separates it from mcp_gpio_write and mcp_gpio_config. It does not explicitly name a sibling it is not, so it falls short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: you read a pin when you need its value, and passing 'all' reads every pin. There is no explicit when-to-use versus mcp_gpio_scan or mcp_gpio_watched, and no prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_gpio_scanA
Scan all hardware GPIO pins on agent and return their value, type, pull resistor, and name: BCM 2-27 on a Raspberry Pi, GP0-GP28 (minus the WiFi-reserved GP23/24/25/29) on a Pico. Only supported on Raspberry Pi / Pico hardware.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the read-only nature implicitly via 'Scan...return', the exact return fields, and hardware gating, but never states side effects, permissions, or error behavior on unsupported hardware. Adequate but incomplete for a tool with zero structured behavioral hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence delivers the action, the return fields, and the platform-specific pin scope, followed by a short eligibility constraint. Efficient and dense, though the pin-range enumeration is long enough to slightly dilute the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly enumerates return fields (value, type, pull resistor, name) and states hardware and pin-range scope. Only error/failure behavior on non-Pi/Pico targets is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter, so the schema contributes nothing. The description compensates only partially by naming `agent` as the target of the scan, leaving its format (ID? hostname?) and valid values unspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Scan') and resource ('all hardware GPIO pins'), plus the exact payload returned (value, type, pull resistor, name). The word 'all' plus the enumerated pin ranges distinguishes it from the single-pin sibling mcp_gpio_read without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is a hardware eligibility constraint ('Only supported on Raspberry Pi / Pico hardware'), which is useful but is a precondition, not when-to-use-vs-alternative guidance. Nothing says when to pick this over mcp_gpio_read or mcp_gpio_watched for inspecting pins.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_gpio_watchedB
List the GPIO pins that are currently being actively watched (the ones emitting hardware interrupts/webhooks).
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, but only 'List' implies a read-only operation and the parenthetical clarifies the semantic meaning of 'watched'. It does not disclose whether the agent must be running, permissions required, return format, or error behavior for an invalid agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words, clearly leading with the verb and resource before the clarifying parenthetical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter list tool with no output schema, the description is minimally adequate but leaves the required 'agent' parameter undefined and gives no sense of what the listing returns or how it relates to watched-pin configuration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single required 'agent' parameter is entirely undocumented in both schema and description. The description adds no meaning about what an 'agent' identifier is or how it scopes the watched-pin list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (GPIO pins) with a clear scope qualifier ('currently being actively watched'). The parenthetical explains what 'watched' means (interrupts/webhooks), implicitly distinguishing it from siblings like mcp_gpio_read or mcp_gpio_scan, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus mcp_gpio_read, mcp_gpio_scan, or mcp_gpio_config. There are no exclusions or prerequisite conditions stated; the agent must infer usage from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_gpio_writeA
Write a value to a GPIO pin on agent ('0', '1', 'on', 'off', or 'toggle'). Optional duration in seconds, after which the pin reverts to its previous state. If the pin has a configured 'max' pulse duration, the effective duration is clamped to it - and if no duration is given but 'max' is set, 'max' is used as the duration automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes | ||
| value | Yes | ||
| duration | No | ||
| name_or_gpio | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does disclose non-obvious semantics: the pin reverts to its previous state after the duration, duration is clamped to a configured 'max', and 'max' is used as a default. However, it omits error behavior for invalid pins, idempotency, hardware risk, and permission requirements for a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the core action and value options before the conditional duration rules. Every clause adds information, though the second sentence is long and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations, no output schema, and 0% schema coverage, the description covers the main behavioral semantics well but leaves gaps: no return/confirmation info, no error handling, and no indication of whether the write is persistent or stateful beyond the duration rule.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does for the key parameters: it enumerates the valid 'value' strings ('0','1','on','off','toggle') that the bare string schema leaves unconstrained, and explains 'duration' semantics including clamping and defaulting. It does not clarify 'name_or_gpio' beyond naming.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Write') and resource ('a value to a GPIO pin') and enumerates the accepted value strings, so an agent can immediately distinguish this mutation tool from siblings like mcp_gpio_read or mcp_gpio_config.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the duration parameter's behavior and clamping, which implies intended usage for timed pulses, but it never says when to prefer this over mcp_gpio_config or other variants, nor any prerequisites such as pin validity or permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_sensor_configA
Configure a named sensor on agent. A sensor runs a script and its output is the reading. script is " [args...]": a bare filename in the agent's scripts/ folder (no paths - that folder is the only allowed location), with letters/digits-only arguments. On a Raspberry Pi it is a shell script run with sh; on a Pico a .py file the agent execs in-process. Pass remove=true to delete the sensor.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| agent | Yes | ||
| remove | No | ||
| script | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the platform-dependent execution model (`sh` on a Raspberry Pi vs in-process .py exec on a Pico), the sandbox constraint (scripts/ folder is the only allowed location, no paths), the argument charset restriction, and that remove=true deletes the sensor. It omits what happens when reconfiguring an existing sensor name and any error behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all front-loaded and information-dense: identity, what a sensor is, the script contract, then the delete flag. Nothing is repeated from the schema and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param mutation tool with no annotations and no output schema, the description covers creation semantics, the script contract, and deletion. Missing only overwrite/reconfiguration behavior on an existing name and error outcomes, which is a modest gap rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does for the hardest parameter: `script` gets its exact grammar ('<script-file> [args...]', bare filename, letters/digits-only args) plus platform semantics. `remove` is defined as deletion. `agent` and `name` are only implied by 'a named sensor on `agent`', leaving two parameters without explicit definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Configure a named sensor on `agent`') and immediately disambiguates from the read-side sibling by describing the script/execution model rather than readings. An agent can tell this apart from mcp_sensor_read without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the description explains what a sensor is and that remove=true deletes it, but never states when to call this versus mcp_sensor_read, nor any prerequisites or when-not-to-use conditions. The delete path is the only explicit routing signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_sensor_readA
Read sensors on agent. With no name, reads every configured sensor and returns them merged into one JSON object; with a name, reads just that sensor. Every reading is nested under its sensor's own name: a script emitting a JSON object with several fields nests whole, one emitting a single-field object contributes just that field's value, and any other output is wrapped the same way.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| agent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It details the return-shape semantics (nesting rules) which is valuable, but omits error handling, whether readings trigger any device activity, and any auth/permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the two modes, then the nesting rules. Well-structured and efficient, though the nesting explanation is dense and could be terser.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only sensor tool with no output schema, the description covers the input semantics and the return shape well. Missing only ancillary details like error cases or side effects, which limits it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the meaning of `name` (which sensor to read) and `agent` (target), clearly stating the no-name fallback behavior. Adds real value over the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Read sensors on `agent`'. States the two operating modes (all sensors merged versus a single named sensor). Reasonably distinguishable from mcp_sensor_config, though it doesn't explicitly name that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the behavior difference between providing `name` and omitting it, which implicitly tells the agent when to use each mode. However, it does not name alternatives or state exclusions (e.g., contrast with mcp_sensor_config for setup).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.9.23- First observed
mcp_agent_logs - First observed
mcp_agent_restart - First observed
mcp_agent_upgrade - First observed
mcp_agents_list - First observed
mcp_config_load - First observed
mcp_config_read - First observed
mcp_config_write - First observed
mcp_gpio_config - First observed
mcp_gpio_read - First observed
mcp_gpio_scan - First observed
mcp_gpio_watched - First observed
mcp_gpio_write - First observed
mcp_sensor_config - First observed
mcp_sensor_read
TDQS
Scored across 14 tools
Each tool has a distinct domain and action: GPIO read/write/scan/config/watched, sensor config/read, config load/read/write, agent lifecycle, and agent listing. Overlaps such as GPIO read-all versus scan are differentiated by scan returning pin metadata while read returns values, so selection is clear.
All tools use the mcp_ prefix and snake_case with a domain_action pattern, which is highly predictable. Minor deviations include mcp_agents_list (plural domain) versus mcp_agent_* (singular) and mcp_gpio_watched using an adjective rather than a verb.
With 14 tools, the set is well-scoped for bridging to hardware agents, covering GPIO, sensors, configuration, and agent lifecycle without obvious redundancy. Each tool earns its place and the count stays within a manageable range.
The surface covers most core operations: GPIO read/write/config/scan, sensor config/read, config load/read/write, agent list/restart/upgrade/logs. Minor gaps remain, such as no explicit sensor listing tool or dedicated agent start/stop operations, but they are largely workaroundable via existing tools.
Maintenance
Related MCP Connectors
Persistent memory, hybrid search and a goal graph for AI agents, over stdio or remote HTTP.
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
Verified, pay-per-use API tools for AI agents through one authenticated connection.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceExposes any OpenAPI spec endpoints as AI agent tools via stdio, requiring no code generation or maintenance.18MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to discover and interact with iOS apps through a local MCP gateway, converting remote Streamable HTTP MCP endpoints into stdio tools. Provides dynamic device discovery, tool schema introspection, and deterministic tool calling for app analysis.-
- FlicenseAqualityCmaintenanceExposes Justworx devices to AI agents as MCP tools and resources, backed by the public Developer API. Supports local stdio and hosted remote OAuth operation for controlling device IO, rules, and viewing live state.6-
- FlicenseNot gradedqualityCmaintenanceEnables agents to discover and execute local tools via a Streamable HTTP endpoint using the Groq OpenAI-compatible API.-