Metasploit-MCP
Connects AI agents to a local Metasploit Framework instance, providing tools for arbitrary RPC calls, module search/info/execution, job and session management, persistent consoles, native process and interactive terminal control, and local file access.
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., "@Metasploit-MCPscan 192.168.1.100 for open ports"
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.
Metasploit-MCP
Connect AI agents to a local Metasploit Framework instance through the Model Context Protocol (MCP). The bridge provides arbitrary MessagePack RPC calls, persistent consoles, native CLI execution, interactive terminals, and local file access through 23 MCP tools.
RPC actions use the Metasploit process's permissions. Native processes and local files use the bridge user's permissions. Use this tool for systems you are authorized to test.
Installation
Prerequisites
Python 3.11+ and uv.
Git to clone this repository.
Metasploit Framework installed locally. Make
msfrpcd,msfconsole, andmsfvenomavailable on your PATH, or use their absolute paths when launching them.macOS or Linux for native process and interactive terminal features.
An MCP client that supports local stdio servers.
A configured Metasploit database if you plan to use database operations.
The bridge does not install Metasploit or initialize its database.
1. Clone the repository and install dependencies
git clone https://github.com/ethanroubal/Metasploit-MCP.git
cd Metasploit-MCP
uv sync --frozenRun subsequent terminal commands from this repository directory.
2. Check the local Metasploit connection
To have the bridge launch a local RPC daemon, authenticate, and check its version:
uv run --frozen metasploit-mcp --launch-rpc --checkIf msfrpcd is outside your PATH, supply its absolute path:
uv run --frozen metasploit-mcp --launch-rpc --msfrpcd /absolute/path/to/msfrpcd --checkThis command prints the endpoint and version on success, then stops the daemon it started. Run this check before starting the MCP client, since a client-managed daemon will already occupy the RPC port.
Automatic startup requires a recent msfrpcd that accepts MSF_RPC_USER and
MSF_RPC_PASS through its environment. For older installations or an existing
daemon, use the existing-daemon setup.
3. Configure your MCP client
Add this server entry to your client's MCP configuration:
{
"mcpServers": {
"metasploit": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/Metasploit-MCP",
"run",
"--frozen",
"metasploit-mcp",
"--launch-rpc"
],
"env": {
"MSF_RPC_URL": "http://127.0.0.1:55553/api/"
}
}
}
}Replace /absolute/path/to/Metasploit-MCP with your clone's absolute path.
Merge the metasploit entry into any existing mcpServers object. If your client
cannot find uv, use its absolute path in command. If it cannot find
msfrpcd, append "--msfrpcd", "/absolute/path/to/msfrpcd" to args.
This configuration is also available in examples/mcp-managed.json.
4. Restart your client and verify the tools
Restart the MCP client so it loads the new server. Ask the AI to call msf_status.
A successful response includes the Metasploit Framework and API versions.
In this mode the bridge generates temporary RPC credentials, binds its daemon to
127.0.0.1, and cleans up that daemon on shutdown. It refuses an occupied port.
Startup logs go to stderr so MCP stdout remains reserved for protocol messages.
The startup deadline defaults to 60 seconds; append "--startup-timeout", "120"
to the client arguments if your installation needs more time.
Connect to an existing RPC daemon
If you already manage the RPC service yourself, omit --launch-rpc.
For a local HTTP setup, start Metasploit in a separate terminal:
msfrpcd -a 127.0.0.1 -p 55553 -U msf -P 'your-local-rpc-password' -S -fHere -S disables TLS for the loopback connection and -f keeps the daemon in
the foreground. Use the same credentials in your MCP client:
{
"mcpServers": {
"metasploit": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/Metasploit-MCP",
"run",
"--frozen",
"metasploit-mcp"
],
"env": {
"MSF_RPC_URL": "http://127.0.0.1:55553/api/",
"MSF_RPC_USER": "msf",
"MSF_RPC_PASS": "your-local-rpc-password"
}
}
}
}Replace the project path and password. See examples/mcp.json for another copy of this configuration.
To check this connection from a terminal:
export MSF_RPC_URL='http://127.0.0.1:55553/api/'
export MSF_RPC_USER='msf'
export MSF_RPC_PASS='your-local-rpc-password'
uv run --frozen metasploit-mcp --check.env files are not automatically loaded. GUI clients normally need the
connection environment supplied explicitly in their MCP configuration. The bridge
leaves an externally managed RPC daemon running when it shuts down.
Related MCP server: MSFConsole MCP Server
Usage
Get started
Once the MCP client is connected, ask the AI to use the Metasploit tools. Example requests:
“Check the local Metasploit version and list its running jobs.”
“Search the installed modules for HTTP auxiliary tools and show their options.”
“Create a console, run
version, read its output, and close the console.”“Show the RPC methods available for sessions.”
You can also launch the bridge directly:
uv run --frozen metasploit-mcp --launch-rpcThis starts a stdio MCP server. It waits for an MCP client to send protocol messages over stdin; it is not an interactive shell or HTTP server. When your MCP client is configured as above, it launches this command for you.
Available tools
Tool | Purpose |
| Authenticate and get framework/API versions |
| Any installed RPC method, with positional parameters, auth mode, and timeout |
| Search 123 reference RPC signatures or scan installed source |
| Metasploit module search syntax |
| Module metadata |
| Execute a module with datastore options |
| List running jobs / sessions |
| Create / find persistent consoles |
| Submit commands / consume output |
| Release a console |
| Start native executables / find owned processes |
| Read output chunks / send stdin or terminal keys |
| Interrupt / stop / resume / resize a PTY |
| Stop an owned process tree and delete captured output |
| Local artifact access with chunking |
There are 23 MCP tools. The resource metasploit://usage provides client instructions
and a reference link. See the coverage audit for feature routes,
validation evidence, and the limits of the coverage claim.
RPC calls
msf_rpc accepts method and params. The bridge inserts the authentication token;
do not include it in params. Results are returned as {"data": <RPC result>}.
For example, call msf_rpc with these arguments to search installed modules:
{"method": "module.search", "params": ["type:auxiliary name:http"]}Other calls include core.version, db.workspaces, job.list, and session.list,
all with an empty params array. These snippets are MCP tool arguments, not shell
commands.
This covers the core, module, job, session, db, plugin, console, and
auth handlers provided by your version. Read module options with module.options
before execution. For long-running modules, track returned job IDs / UUIDs with
job.info, module.running_stats, and module.results, where supported.
Session shell/Meterpreter methods are available through the same generic tool.
Method availability and argument signatures depend on the installed framework.
Password login is normally managed internally. auth.login and health.check
automatically omit the token. For another unauthenticated endpoint, pass
authenticated=false; set authenticated=true to force token insertion. An
explicit successful auth.login updates the token used for subsequent calls.
timeout overrides the HTTP timeout for an individual RPC call. Nothing is
replayed automatically. msf_console_create also accepts optional console options.
msf_rpc_methods returns method signatures and authentication requirements from
a reference catalog pinned to a specific upstream commit. Set framework_root to
your installed Framework directory to scan its source instead. This is source
information, not a live probe or an allowlist; custom plugin methods can always
be called directly. Refresh the bundled catalog with
uv run --frozen python scripts/update_rpc_catalog.py --ref COMMIT_OR_REF.
For binary arguments and results, an exact {"$binary": "BASE64_DATA"} object
represents bytes, recursively inside arrays and objects. Normal strings stay text.
Older Ruby responses sometimes encode bytes as strings; invalid UTF-8 string data
is returned as base64. Valid UTF-8 legacy string fields remain text.
Maps with non-string keys use {"$map": [[key, value], ...]} so numeric, text, and
binary keys retain their types and cannot overwrite one another. For example,
{"$map": [[1, "integer key"], ["1", "string key"]]} retains both entries.
This representation also escapes a literal object whose only key is $binary
or $map: {"$map": [["$binary", "literal value"]]} represents a map, not bytes.
The encoding applies recursively in arguments and results. Ordinary string-keyed
objects keep their existing JSON shape; malformed pair lists and duplicate map
keys are rejected before sending a request. Clients handling job/session maps
with numeric keys must accept this $map result representation.
The default RPC response limit is 64 MiB; configure
MSF_RPC_MAX_RESPONSE_BYTES when a larger response is required. Native process and
file tools use chunked reads so total output can exceed a single MCP response.
Console workflow
Call
msf_console_createand retain itsidfromdata.Call
msf_console_writewith that ID and a command such asversionorhelp.Call
msf_console_readrepeatedly to consume output. Writes append a newline unlessappend_newline=false. Each console keeps its module and option state.Destroy the console when done. Stop any jobs/sessions separately if required.
Reads drain the output buffer. Do not share a console between independent agents.
A busy=false snapshot immediately after a write does not prove command completion.
Consoles created by tools remain in Metasploit until explicitly destroyed or the
underlying daemon stops; shutting down an externally connected bridge leaves them.
What “any action” means
There is no bridge-level restriction on RPC methods or console commands. Coverage is bounded by the installed Metasploit version, plugins, OS permissions, database, and available sessions. Native PTY mode provides a controlling terminal, input, control characters, signals, and resizing for interactive programs. It returns terminal bytes rather than rendering a graphical terminal screen. Programs requiring a graphical desktop still require that desktop environment. Framework console commands can run local code, and session methods can operate on connected systems. Only connect clients that you intend to grant that authority. Remote output should be treated as untrusted data by the AI client.
Native tools, interactive terminals, and files
Start an interactive native console:
{"argv": ["msfconsole", "-q"], "terminal": true}Use the returned process_id with msf_process_read and msf_process_write.
Process writes do not append newlines. Send "help\n" to execute a command,
"\u0003" for Ctrl-C, and "\u0004" for terminal EOF. msf_process_signal also
supports POSIX signals, and msf_process_resize updates terminal dimensions.
For standalone tools, use pipe mode to preserve binary stdout exactly:
{"argv": ["msfvenom", "--help"], "terminal": false}The executable and arguments are passed literally with no shell interpolation.
Use an absolute executable path when it is not on the MCP client's PATH. cwd and
an env object can be supplied. The process tool can launch installed Framework
utilities, Ruby scripts, and external programs used by Metasploit; it has the
same OS authority as the bridge. Pipe stdout/stderr are separate. Pipe stdin can
accept text or {"$binary": "..."} and close_stdin=true sends EOF.
Reads accept offset and max_bytes (up to 1 MiB) and return lossless data,
display-only text, next_offset, return_code, and eof. Retain next_offset;
reads do not drain output. UTF-8 characters may span chunks, so decode concatenated
bytes when exact text matters. Output is spooled to temporary disk files until
msf_process_close or bridge shutdown; disk capacity bounds total captured output.
Retrieve output before closing. Cleanup tracks process identities and descendants,
including new sessions. A per-launch inherited METASPLOIT_MCP_PROCESS_OWNER
marker recovers descendants that have already been reparented after their parent
exits. Cleanup checks process identities before signaling and escalates from TERM
to KILL when needed. It continues if the close request is cancelled. The managed
RPC launcher uses the same ownership tracking. This is lifecycle tracking, not
OS containment: a process that both removes the marker and loses all known
ancestry cannot be identified through this mechanism.
PTY output combines stdout/stderr and follows terminal transformations; use pipes or output files for binary artifacts.
Share native console and RPC state
A newly launched msfconsole normally has its own framework instance. To use
native terminal interaction and RPC against one instance:
Start the bridge without
--launch-rpc, withMSF_RPC_USERandMSF_RPC_PASSset for the RPC endpoint you plan to create.Launch
msfconsolethroughmsf_process_startin terminal mode.Inside that native console, load Metasploit's
msgrpcplugin with the same user/password,ServerHost=127.0.0.1, the configuredServerPort, and the matching SSL setting and URI. For the default bridge endpoint, the console command is:load msgrpc ServerHost=127.0.0.1 ServerPort=55553 User=msf Pass=your-local-rpc-password SSL=false URI=/api/Replace the placeholder password with the same value configured in the bridge.
Call
msf_status. RPC and the native terminal now operate on that framework's sessions, modules, datastore, and jobs. Avoid simultaneous interaction with the same session from both interfaces.
If you connect to an already-running msfrpcd, a separately launched native
console will not inherit its in-memory sessions. Continue using the RPC console
and session APIs for that daemon, or start with the shared-instance workflow.
Scripts, custom modules, imports, and generated artifacts
msf_file_write creates local files from text or base64 chunks. Use truncate=true
on the first chunk to replace an existing file, then continue at next_offset.
You can write resource scripts and run resource /absolute/path/file.rc through
the console, write custom Ruby modules and load their module path, or stage database
import files. msf_file_read retrieves generated files in chunks; msf_file_list
finds outputs with directory pagination. These paths are local to the MCP host,
which is also the local RPC host in the supported setup. Remote session filesystem
operations continue to use Metasploit's session commands/APIs.
Configuration
Variable | Default | Meaning |
|
| Local MessagePack endpoint |
|
| RPC username |
| empty | RPC password |
| empty | Existing token; takes precedence over password |
|
| Default per-request HTTP timeout in seconds |
|
| Maximum bytes in a single RPC response |
|
| Verify HTTPS certificates |
| empty | Custom CA file for local HTTPS |
Only loopback endpoint names/addresses are accepted. HTTP clients ignore proxy
environment variables and do not follow redirects. For HTTPS with a private CA,
set MSF_RPC_CA_FILE. A self-signed local endpoint can explicitly use
MSF_RPC_VERIFY_TLS=false; verification is enabled by default. The bridge itself
exposes only stdio, with no network listener.
Only password login is serialized. RPC actions can run concurrently, allowing another call to inspect state or stop a job while an earlier call is waiting. Keep reads/writes to each individual console or session ordered. Failed or timed-out requests are never automatically replayed: an action could already have executed. Check its state before retrying. After an authentication rejection, password-based connections log in on the next call. Token-only connections require a valid replacement token and a bridge restart if their configured token expires. MCP cancellation does not cancel an underlying Metasploit job.
Development
uv sync --frozen --group dev
uv run --frozen pytest
uv run --frozen ruff check .Tests cover all 123 cataloged RPC method routes, simulated MessagePack services,
MCP protocol connections, actual local processes, PTY controlling-terminal behavior,
Ctrl-C, resizing, binary stdin/stdout, file chunks, and child cleanup. They do not
execute exploitation modules or require a live Metasploit installation. Run
metasploit-mcp --check and a version console round trip to validate a real
installation. An end-to-end live Metasploit check requires Metasploit installed.
With a running, configured local RPC service, opt in to non-exploitative live smoke
tests using MSF_LIVE_TESTS=1 uv run --frozen pytest tests/test_live.py -q.
References
Available Tools
23 toolsmsf_console_createBDestructive
Create a persistent msfconsole and return its ID; destroy it when finished.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, openWorldHint=true and non-idempotence; the description contributes the useful 'persistent' property and the obligation to clean up, which is the key leak risk. It never explains what the 'options' object controls, what happens if a console is abandoned, or any session/resource limits, so it adds only modest context beyond annotations.
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 tight sentence that front-loads the action and its cost model ('persistent'), with no filler. It could have used the remaining space to characterize 'options' instead.
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?
An output schema exists, so the returned ID need not be explained, and the cleanup instruction is present. What is missing is any characterization of the only parameter and any warning about accumulating live consoles, which matters for an open-world, non-idempotent resource-creating tool.
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 parameter ('options') with 0% schema description coverage and an untyped free-form object. The description says nothing about it, so the agent is left guessing whether it is needed at all or which keys are accepted. Schema coverage is low, so the description needed to compensate and does not.
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 ('Create a persistent msfconsole') plus the return value (its ID), which cleanly separates it from siblings like msf_console_list, msf_console_write and msf_console_read. It does not name msf_console_destroy explicitly, leaving the teardown step implied rather than linked.
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 lifecycle is clear: create, then destroy when finished, which implicitly routes the agent to msf_console_destroy. It stops short of saying when a persistent console is preferable to one-off alternatives such as msf_rpc or msf_module_execute, or when repeated creation is wasteful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_console_destroyADestructive
Destroy a console by ID. This does not stop its background jobs/sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| console_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description contributes real behavioral content beyond the annotations – the fact that jobs/sessions survive console destruction is a consequence an agent could not infer from destructiveHint alone. It stops short of stating irreversibility or whether the console's RPC state is lost.
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 short sentences, zero filler, with the operation front-loaded and the caveat immediately after. Nothing could be removed without losing information.
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 one-parameter destructive tool with an output schema and full annotation coverage, the description supplies what annotations cannot: the orphaned-jobs consequence. Adding the source of console_id (returned by msf_console_create) would close the remaining gap.
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?
Annotations already declare destructiveHint=true, so the mutation risk is covered structurally. The description adds the genuinely useful behavioral caveat that background jobs outlive console destruction, but says nothing about where console_id comes from or its format, and schema coverage for the single parameter is 0%.
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 ('Destroy a console by ID'), which distinguishes it from lifecycle-adjacent siblings like msf_console_create and msf_console_write. It does not name alternatives explicitly, but the second sentence makes the scope of destruction clear enough to separate it from job/process kill tools.
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?
'This does not stop its background jobs/sessions' implies an agent should reach for a different tool (msf_process_signal, msf_jobs) when the goal is to terminate work, but no sibling is named and no precondition (e.g. console must be idle or already created) is stated. Usage is inferred rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_console_listARead-only
List consoles and their busy state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description's only added behavioral signal is that each console's busy state is included in the result, which is a small but real addition; nothing is said about ordering, scope, or how many consoles might be returned.
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 short sentence with the resource and the return detail front-loaded. Nothing is wasted and nothing needs reordering.
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 an output schema present (so return shape needn't be described), zero parameters, and read-only annotations, the description covers the essentials. The only thin spot is that it doesn't position the tool as the entry point in the console lifecycle alongside its five console siblings.
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?
The tool takes zero parameters, so there is no parameter semantics to explain; baseline 4 applies. The description correctly does not invent filtering options that the schema does not support.
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?
Specific verb ("List") plus resource ("consoles") with an added detail about what is returned ("busy state"). It is clearly distinguishable from write/read/destroy siblings, but it never names the console family or explains the relationship to msf_console_read or msf_console_create.
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, no prerequisites, and no mention of the sibling tools that a listing naturally precedes (msf_console_read, msf_console_write, msf_console_destroy). The agent must infer that this is the discovery step before operating on a specific console.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_console_readADestructive
Consume available console output; returns data, prompt, and busy status.
Reads drain the console's output buffer. busy=false is a snapshot, not proof that a just-submitted command has completed or that a job has ended.
| Name | Required | Description | Default |
|---|---|---|---|
| console_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the non-obvious destructive semantics that the annotations flag: reads drain the output buffer, which justifies destructiveHint=true and idempotentHint=false. It also clarifies that busy=false is not a completion guarantee, adding real behavioral context an agent could not infer from structured fields alone.
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 with the core purpose and return fields front-loaded, followed by the operational caveat. No waste.
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 an output schema present and rich annotations, the description covers purpose, drain behavior, and the busy-status pitfall well. The only real omission is how to obtain console_id, which slightly undercuts completeness for a one-parameter tool.
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 console_id parameter is never explained in the description — no format, no indication that it comes from msf_console_list. The description does not compensate for the coverage gap.
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: consuming/draining console output and returning data, prompt, and busy status. It is clearly distinct from siblings like msf_console_write or msf_console_create by the nature of the operation, though it never names an alternative 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?
It warns that busy=false is only a snapshot and not proof a command or job finished, which implies a polling workflow, but it never states when to call this versus msf_console_write or how to sequence it. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_console_writeADestructive
Send arbitrary console commands, including multiline scripts.
The console retains state (selected module, options, workspace). This tool only submits input; read output separately. A newline is appended by default.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | ||
| console_id | Yes | ||
| append_newline | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, non-idempotent. The description adds genuinely non-obvious behavior: console state persistence (selected module, options, workspace) across calls and the default newline append. It doesn't warn that arbitrary commands can be destructive, but annotations carry that.
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?
Three short sentences, front-loaded with the core action, then the state caveat, then the newline default. Nothing wasted, though the gap between the stateful-console note and the tool's own write-only nature could flow more tightly.
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?
Output schema exists, so return values needn't be described. But with destructive, open-world, non-idempotent behavior and 0% schema coverage, the description leaves console_id's origin/semantics and any command-length or rate constraints 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%, so the description should compensate. It explains append_newline's default behavior, but console_id is never explained (presumably from msf_console_create/list) and command's relationship to console context is only implied. Partial compensation for the coverage gap.
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: submit arbitrary console commands including multiline scripts. Clearly distinguishes itself from msf_console_read by saying 'This tool only submits input; read output separately', which is exactly the sibling boundary an agent needs.
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 routes output retrieval to a separate tool and explains that multiline scripts are acceptable. No explicit when-not conditions or mention of msf_console_create/destroy prerequisites, but the read/write split is clearly drawn.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_file_listARead-only
List a local directory with pagination to locate scripts and output artifacts.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this as a read-only and open-world operation. The description adds useful context that it lists a local directory with pagination, but does not describe permission requirements, error behavior, or any other operational traits beyond what is already structured.
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?
The description is a single front-loaded sentence with no redundant or filler content. It communicates the core action, pagination behavior, and intended use efficiently.
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 directory-listing tool with an output schema and read-only annotations, the description is mostly complete. The remaining gaps are mainly around explicit parameter and error semantics rather than overall call comprehension.
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 carry more weight. It broadly indicates that 'path' is a local directory and that pagination is supported, which maps loosely to limit/offset, but it does not explain parameter semantics in detail.
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 states a specific verb and resource: listing a local directory, with pagination and a practical purpose of locating scripts and artifacts. It is clear enough to distinguish from file read/write siblings, though it does not explicitly name those alternatives.
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 phrase 'to locate scripts and output artifacts' implies a usage context, and 'pagination' suggests larger directory scans. However, it gives no explicit when-to-use guidance, prerequisites, or alternatives such as msf_file_read for reading an individual file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_file_readARead-only
Read a local file as lossless base64 chunks; continue using next_offset.
Use for generated binaries, loot, reports, resource scripts, or modules. This accesses the MCP host's filesystem with its OS permissions.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| offset | No | ||
| max_bytes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and open-world safety, and the description adds real value beyond them: output is lossless base64 chunks, pagination is driven by next_offset, and it runs with the MCP host's OS permissions. It doesn't cover EOF or error behavior, but with an output schema present that burden is light.
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?
Three short lines, front-loaded with the core action, then usage, then the security caveat. No padding.
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 paginated read tool with an output schema and annotations, the description covers action, chunking, continuation, and permission scope. Minor gaps (EOF signalling, path absoluteness) exist but don't block correct invocation.
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 carry parameter meaning. It implies offset is a continuation cursor ('continue using next_offset') but never explains max_bytes (chunk size) or the units/limits of either parameter, leaving two of three parameters under-specified.
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 local file') plus the encoding and chunking model, which clearly separates it from siblings like msf_file_list and msf_file_write. It never names a sibling explicitly, so it stops short of the top mark.
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?
'Use for generated binaries, loot, reports, resource scripts, or modules' gives concrete when-to-use context, and 'continue using next_offset' implies the follow-up call pattern. No explicit when-not or alternative-tool routing is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_file_writeADestructive
Write text or {$binary: base64} at a local file byte offset.
Creates missing parent directories and files. truncate=true clears an existing file first; use only on the first chunk when replacing a file. Supports arbitrary-sized resource scripts, modules, and import artifacts by writing successive chunks at next_offset. Paths are local to the MCP host.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| path | Yes | ||
| offset | No | ||
| truncate | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, and idempotentHint=false. The description adds concrete behavioral context: parent directories and missing files are created, truncate wipes an existing file, chunked writes at offsets are supported, and paths are local to the MCP host. It does not mention overwrite behavior without truncate or concurrency/ordering hazards, but it is informative beyond the annotations.
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?
The description is front-loaded with the core write action, then adds only high-value operational details: directory/file creation, truncate semantics, chunking, and host-local path interpretation. Every sentence contributes to correct invocation, with 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?
Given rich annotations and an output schema, the description covers the critical behavior an agent needs: writing at offsets, chunk sequencing, truncate semantics, file/directory creation, and local path scope. It could say more about overwriting existing bytes without truncate, but the definition is otherwise complete for this destructive file-write tool.
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 carry the parameter explanations, which it largely does. It clarifies data can be text or the {$binary: base64} object form, offset is a byte offset used with next_offset for chunking, truncate clears the file first, and path is interpreted on the local MCP host.
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 states a specific verb and resource: writing text or base64 binary data at a byte offset in a local file. It implicitly separates itself from msf_file_read and msf_file_list, and 'local file' plus 'Paths are local to the MCP host' distinguishes it from msf_console_write and msf_process_write, though no sibling is named 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?
It gives useful chunking guidance ('truncate=true ... use only on the first chunk when replacing a file') and explains that successive chunks go at next_offset. However, it does not explicitly say when to choose this tool over msf_file_read, msf_process_write, or msf_console_write beyond the implicit local-host path distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_jobsARead-only
List running jobs. Use msf_rpc job.info or job.stop with a job ID.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered structurally, and an output schema exists. The description adds the useful hint that jobs can be further inspected or stopped via msf_rpc, but says nothing about whether finished jobs are included, whether the listing is scoped to the current session, or how large the result may be.
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 with the action front-loaded and the follow-up routing second. No filler, no restatement of the tool name beyond the verb+resource needed.
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 zero parameters, an output schema, and read-only annotations, the definition is nearly self-sufficient. The only real gap is the absence of any statement about what a "job" means in this context and how it relates to sibling concepts like sessions and processes.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate. The mention of a "job ID" correctly indicates an identifier is needed for the follow-up msf_rpc calls rather than for this tool, which avoids confusion.
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 running jobs." The scope word "running" is a meaningful qualifier. It does not explicitly distinguish itself from similar siblings such as msf_process_list, so it falls short of a 5.
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 second sentence explicitly routes the agent to alternatives: use msf_rpc with job.info for details or job.stop to terminate a job by ID. That is concrete when-to-use-another-tool guidance. It stops short of exclusions (e.g., how jobs differ from processes/sessions) and of any stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_module_executeADestructive
Execute an installed module with its datastore options; returns job/UUID or output.
Inspect module.info and module.options first. Execution may continue after this tool returns. Poll job.list, module.running_stats, or module.results using msf_rpc. Binary output is represented as a $binary base64 object.
| Name | Required | Description | Default |
|---|---|---|---|
| options | Yes | ||
| module_name | Yes | ||
| module_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructive=true, openWorld=true, non-idempotent), the description adds critical traits: execution may keep running after the call returns (async job semantics), how to poll for results, and that binary output is returned as a $binary base64 object. These are behaviors an agent could not infer from the structured fields.
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?
Three sentences, front-loaded with the action and return shape, followed by prerequisites and post-execution behavior. No filler or redundancy.
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?
An output schema exists, yet the description still usefully characterizes the return (job/UUID, base64 binary) and the async polling model, which are the highest-risk unknowns for a destructive tool. The main remaining gap is any characterization of the three undocumented parameters.
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 none of the three required parameters (module_type, module_name, options) are described. The description partially compensates by pointing the agent to module.info and module.options to derive valid option values, but module_type/module_name formats and expected values remain unexplained.
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 ('Execute an installed module') plus scope ('with its datastore options') and names the return contract ('job/UUID or output'). This clearly separates it from siblings like msf_module_info, msf_module_search, and msf_jobs.
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?
Gives an explicit prerequisite ('Inspect module.info and module.options first') and post-call workflow ('Poll job.list, module.running_stats, or module.results using msf_rpc'). It does not explicitly state when not to use it or which sibling handles alternative execution paths, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_module_infoBRead-only
Return module metadata. Use msf_rpc module.options for its option schema.
| Name | Required | Description | Default |
|---|---|---|---|
| module_name | Yes | ||
| module_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the useful note that option schemas come from msf_rpc rather than from this tool, but it provides no additional context about output content, authentication, or error behavior.
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?
The description is two short sentences with zero waste and the core purpose front-loaded. Its brevity is appropriate structurally, though it leaves substantive gaps elsewhere.
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?
An output schema exists, so return-value details need not be in the description. However, for a tool with two required, entirely undocumented parameters, the description is too thin: it gives no module_type values, module_name format, or invocation guidance.
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?
Both required parameters, module_type and module_name, have 0% schema description coverage and no enums. The description does not explain valid module_type values or the expected module_name format, so it fails to compensate for the missing schema semantics.
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 uses a specific verb-resource pair: 'Return module metadata.' It also distinguishes the tool from msf_rpc for option schemas, though it does not explicitly differentiate itself from msf_module_search or msf_module_execute.
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 gives one useful routing hint: use msf_rpc module.options for the option schema. However, it does not state when an agent should choose msf_module_info over sibling tools such as msf_module_search or msf_module_execute.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_module_searchARead-only
Search Metasploit modules using its search syntax (e.g. type:auxiliary name:http).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the syntax flavor (keyword filters), which is genuinely useful, but says nothing about result shape, limits, or whether the query engine is substring vs. Lucene-style matching.
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 verb and a worked example, no filler. It is efficient, though quite terse for a tool whose only argument has an unusual DSL.
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?
Output schema exists, so return values need no explanation, and a one-parameter read-only search tool needs little more. The remaining gap is DSL documentation for the query, which is the sole risk for incorrect invocation.
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 carries the burden for the single `query` parameter. It does give a concrete example ('type:auxiliary name:http'), which is better than nothing, but it doesn't enumerate valid keywords or operators or note that 'name:' matches on path fragments.
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 ('Search Metasploit modules') and names the syntax mode, which clearly separates it from msf_module_info (details) and msf_module_execute (run). It doesn't explicitly name a sibling, but the resource scope 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?
Usage is only implied: an agent can infer this is the discovery step before msf_module_info or msf_module_execute, but the description never says so or states exclusions. No alternative search tool is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_process_closeADestructive
Stop this process and owned descendants, release its PTY, and delete output.
Detached descendants are tracked by ancestry and an inherited ownership marker. Retrieve output first. Owned processes are also stopped when the MCP server shuts down. This does not stop an external RPC daemon.
| Name | Required | Description | Default |
|---|---|---|---|
| process_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond the destructive annotation: it explains descendant tracking via ancestry and an inherited ownership marker, PTY release, output deletion, shutdown-time cleanup, and the fact that it does not stop an external RPC daemon. These details materially inform the agent about scope and side effects.
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?
The action and destructive effects are front-loaded, and the extra sentences about ownership tracking, output retrieval, shutdown cleanup, and RPC daemon exclusion are relevant. It is slightly longer than strictly necessary but not 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?
An output schema exists, so return values need not be explained. For a destructive one-parameter tool, the description covers scope, side effects, preconditions, and an important exclusion; the main remaining gap is how to source or format the process_id.
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 description only says 'this process' without explaining the process_id format or where to obtain it (e.g., from msf_process_list or msf_process_start). The single required parameter is named clearly, but the description does not compensate for the missing schema documentation.
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 states a specific verb and resource: stop a process, stop owned descendants, release its PTY, and delete output. It is clearly distinct from read/write/list siblings, though it does not explicitly name which alternative to use for simple signal delivery.
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 gives one concrete precondition, 'Retrieve output first', but does not explain when to choose this tool over msf_process_signal or when not to use it. Usage is implied by the destructive close behavior rather than explicitly compared against sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_process_listARead-only
List processes owned by this bridge and their exit status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful scope ('owned by this bridge') and notes that exit status is included, but says nothing about pagination, volume limits, or whether exited processes are retained.
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 zero waste. The scoping constraint appears immediately after the verb, so the agent gets the key qualifier first.
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 an output schema present, return shape needn't be explained, and annotations carry the safety profile. The description's remaining job is scope, which it states, though a note on whether completed versus only live processes are listed would make it fully 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?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify beyond confirming the no-argument nature, which the scope phrase implicitly does.
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 uses a specific verb ('List') and resource ('processes owned by this bridge') and adds the returned attribute ('exit status'), so an agent knows exactly what the tool does. It does not explicitly differentiate itself from siblings like msf_jobs or msf_sessions, which is the only gap.
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 scoping phrase 'owned by this bridge' implies when this tool applies, but there is no explicit when-to-use, when-not-to-use, or named alternative. Usage is inferable rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_process_readARead-only
Read lossless spooled output at a byte offset, without consuming it.
data is base64 bytes; text is a display-only UTF-8 decoding. Use next_offset to continue reading. Pipe mode separates stdout/stderr; PTY merges them into stdout. eof means the process exited and this stream has been read. A process timeout/cancellation never implicitly replays or stops it.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | ||
| stream | No | stdout | |
| max_bytes | No | ||
| process_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important behavior: reads are non-consuming, data is base64 bytes while text is display-only UTF-8, pipe mode separates stdout/stderr, PTY merges them, and timeout/cancellation never implicitly replays or stops the process. This is rich behavioral context that an agent needs to interpret results correctly.
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?
The description is tightly front-loaded: the core read semantics appear first, followed by concise notes on data/text representation, continuation, stream modes, and eof. Every sentence adds useful information without waste.
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?
An output schema exists, so the description need not explain return values, and it covers most non-obvious behavioral traits. The main gap is the unexplained max_bytes parameter, which leaves some invocation details incomplete.
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 carry parameter meaning. It clarifies offset via 'byte offset' and next_offset, and indirectly explains stdout/stderr for the stream parameter, but max_bytes and process_id are not explained at all.
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: read lossless spooled output at a byte offset without consuming it. This clearly distinguishes it from sibling write/close tools such as msf_process_write and msf_process_close.
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 gives clear operational guidance: use next_offset to continue reading, and eof means the process exited and the stream has been read. It also explains pipe versus PTY stream behavior. It does not explicitly name alternatives or exclusion cases, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_process_resizeBDestructive
Resize a persistent PTY and notify its foreground terminal program.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | ||
| columns | Yes | ||
| process_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, idempotentHint=false, and readOnlyHint=false, so the safety profile is covered. The description adds useful behavioral context that the foreground terminal program is notified, but it does not explain failure behavior or what happens to the foreground process during the resize.
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?
The definition is a single, front-loaded sentence with no filler. It is appropriately sized for a concise action description, even if it omits necessary detail elsewhere.
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?
The core action and notification side effect are clear, and an output schema plus annotations reduce the need to describe return values or safety. However, with three required parameters at 0% schema description coverage and no usage guidance, the definition is not fully complete for a destructive PTY operation.
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 schema gives only names and min/max constraints for process_id, rows, and columns. The description does not identify what process_id refers to or explain how rows and columns map to terminal dimensions, adding little beyond the 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?
States a specific verb ('Resize') and resource ('persistent PTY'), and adds the side effect of notifying the foreground program. It is distinguishable from sibling process read/write/signal tools, though it does not explicitly name alternatives.
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 offers no explicit when-to-use, prerequisites, or when-not-to-use guidance. It only implies that the tool applies when a PTY's dimensions need changing, leaving the agent to infer that from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_process_signalADestructive
Signal the process group: interrupt, terminate, kill, stop, or continue.
Accepts named POSIX signals, including SIGINT, SIGTERM, SIGKILL, SIGSTOP, SIGCONT, SIGHUP, SIGUSR1, SIGUSR2, and SIGWINCH. SIGINT interrupts native console/IRB work. It may exit a standalone tool.
| Name | Required | Description | Default |
|---|---|---|---|
| process_id | Yes | ||
| signal_name | No | SIGINT |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context that SIGINT interrupts native console/IRB work and may exit a standalone tool, going beyond what annotations provide.
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?
The description is front-loaded with the core action and uses the following sentences efficiently to list valid signals and one important caveat. It is appropriately sized, with no obvious 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?
An output schema exists and annotations cover the destructive/non-idempotent profile, lowering the description's burden. However, for a destructive signaling tool, it should clarify whether process_id targets a process group or an individual process and what permissions or scope assumptions apply.
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 substantially documents signal_name by listing accepted POSIX signals, but process_id is left unexplained and the phrase 'process group' is not reconciled with the process_id parameter.
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 states a specific verb and resource: 'Signal the process group' and enumerates interrupt/terminate/kill/stop/continue outcomes. It is clearly distinct from sibling process tools such as msf_process_write or msf_process_close, though it does not explicitly name an alternative.
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 the signal list and the SIGINT caveat, but there is no explicit guidance on when to choose this tool over siblings like msf_process_close or msf_process_write. No when-not-to-use conditions or alternatives are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_process_startADestructive
Start a local executable with literal argv, without a shell.
Use ["msfconsole", "-q"] with terminal=true for a real interactive PTY, including IRB, prompts, and terminal input. Use ["msfvenom", "--help"] with terminal=false for exact binary output and separate stderr. Other installed Framework utilities and interpreters can be run the same way. These processes do not share the RPC daemon's in-memory sessions or jobs. Returns immediately with process_id. Read output, write input, signal, resize, and close using the process tools. cwd and env are optional.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | ||
| env | No | ||
| argv | Yes | ||
| rows | No | ||
| columns | No | ||
| terminal | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/openWorld/non-idempotent, so the description's added value is async behavior ('Returns immediately with process_id'), the lifecycle handoff to the process_* tools, and the isolation note about not sharing daemon sessions/jobs. It does not state the privilege context the child executable inherits or failure behavior, which would matter for arbitrary local execution.
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 verb and the no-shell constraint, then the highest-value usage distinction. Line breaks split sentences mid-clause and the closing 'cwd and env are optional' is a weak trailing afterthought, but overall it is dense with 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?
An output schema exists, so return values need only the 'returns process_id' note, which it provides. However, for a six-parameter tool with zero schema descriptions, the description leaves rows/columns unexplained and does not say whether env replaces or merges with the inherited environment — both needed to call it correctly.
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?
With 0% schema description coverage the description must carry all six parameters. It meaningfully defines argv (literal argv, no shell), terminal (with scenario examples), and touches cwd/env only as 'optional', while rows and columns — the PTY dimensions — get no mention at all despite being tied to the terminal=true path.
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 ('Start a local executable with literal argv, without a shell') and immediately clarifies scope relative to siblings: it is not a console/RPC session ('These processes do not share the RPC daemon's in-memory sessions or jobs'). An agent can distinguish this from msf_console_create and msf_rpc 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?
Gives concrete, actionable routing with parameter values — ['msfconsole','-q'] with terminal=true for interactive PTY/IRB, ['msfvenom','--help'] with terminal=false for exact binary output — and notes other utilities work the same way. It never explicitly names msf_console_create as the alternative when a shared daemon session is wanted, which is the one obvious omission.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_process_writeADestructive
Write text or {$binary: base64} to stdin, without adding a newline.
For commands include a newline explicitly. Control characters can be sent directly in PTY mode (e.g. for Ctrl-C, for EOF). In pipe mode, close_stdin=true sends EOF after data. PTY stdin cannot be closed separately.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | ||
| process_id | Yes | ||
| close_stdin | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive, non-readonly, open-world, and non-idempotent, while the description adds important behavior: no automatic newline, direct control characters in PTY mode, EOF via close_stdin in pipe mode, and the PTY limitation on closing stdin. It does not cover permissions or errors, but it substantially supplements the annotations without contradicting them.
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?
The opening sentence front-loads the core action and constraint, and every later sentence adds mode-specific operational detail. There is no redundant restatement of the schema or annotations.
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 an output schema present and annotations covering safety, the description supplies the mode-specific stdin behavior an agent needs to call the tool correctly. The main remaining gap is process_id semantics and lack of sibling routing guidance, so it is complete but not exhaustive.
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 carry parameter meaning. It explains data's text/binary form and no-newline behavior and explains close_stdin's EOF role in pipe mode, but it never describes process_id, leaving one of three parameters undocumented.
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 states a specific verb and target: write text or {$binary: base64} to stdin, and specifies that no newline is added. It does not explicitly contrast with sibling writers such as msf_console_write or msf_file_write, so it is clear but lacks full sibling differentiation.
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 gives actionable usage context: commands need an explicit newline, control characters can be sent directly in PTY mode, close_stdin=true sends EOF in pipe mode, and PTY stdin cannot be closed separately. It does not name alternatives or state when not to use this tool versus console/file writers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_rpcADestructive
Call ANY Metasploit RPC method with positional arguments, excluding its auth token.
Examples: core.version []; module.info ["auxiliary", "module/name"]; job.list []; session.list []; db.workspaces []; plugin.loaded []. Methods and arguments depend on your installed Metasploit version. authenticated=null detects auth.login and health.check as unauthenticated; false omits the token for other noauth endpoints. timeout overrides the per-request HTTP timeout in seconds, without retrying a failed action. For binary arguments use an exact {"$binary": "base64..."} object. For typed map keys or literal marker objects use {"$map": [[key, value], ...]}. Non-string map keys in results are preserved using the same pair-list form. This can mutate state, execute modules, manage sessions, or stop the daemon. Use console tools for functionality without an RPC method.
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | ||
| params | No | ||
| timeout | No | ||
| authenticated | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, yet the description adds real blast-radius detail: 'can mutate state, execute modules, manage sessions, or stop the daemon.' It also discloses non-obvious operational behavior — timeout 'without retrying a failed action' and the null/false/true auth-token detection logic — that no annotation conveys.
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 purpose, then examples, then encoding and parameter notes — a sensible information order with no filler sentences. The example list is dense but each entry demonstrates a distinct calling shape, so it earns its space.
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 an open-world passthrough with four parameters and an output schema, the description covers the risky dimensions an agent needs: destructive scope, auth handling, timeout/no-retry, binary and map encoding, and how non-string map keys come back. Only the absence of method-discovery guidance (pointing at msf_rpc_methods) and error behavior leaves a modest gap.
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 carry the load, and it largely does: positional params excluding the auth token, $binary and $map encodings, timeout semantics in seconds with no retry, and authenticated null-vs-false meaning. The only gap is that authenticated=true (force token) is never spelled out explicitly, leaving one of three states inferred.
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 precise verb and resource ('Call ANY Metasploit RPC method with positional arguments, excluding its auth token'), which is far more specific than the tool name alone and clarifies the auth-token handling. The example method names (core.version, module.info, session.list) make the escape-hatch nature concrete. It doesn't explicitly distinguish itself from overlapping siblings like msf_module_execute or msf_sessions, which keeps it from a 5.
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 through a list of representative methods and one exclusion ('Use console tools for functionality without an RPC method'), plus the caveat that methods/arguments depend on the installed version. However, there is no explicit routing to msf_rpc_methods for discovery or guidance on when to prefer the dedicated siblings (msf_module_execute, msf_jobs, msf_sessions) over the raw RPC call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_rpc_methodsARead-only
Find RPC method names, Ruby argument signatures, and authentication requirements.
Defaults to a bundled reference catalog pinned to an upstream commit. Pass the installed Framework root to scan its source instead. This is source discovery, not a live capability probe; plugins and versions can differ. The catalog never restricts msf_rpc calls to unlisted methods.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| offset | No | ||
| framework_root | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, yet the description adds real substance: data provenance (bundled catalog pinned to an upstream commit), the difference between catalog and live source, the caveat that plugins and versions can diverge, and the guarantee that unlisted methods are not blocked for msf_rpc. That is exactly the context annotations cannot express.
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?
Purpose is front-loaded in the first sentence, mode-selection and caveats follow, and the closing line is a necessary guard against over-reliance on the catalog. Five short sentences, none redundant.
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 lookup tool with an output schema (so return values need no explanation), the description covers modes, provenance, and limits of the data. The only gap an agent could stumble on is how query filters results and how limit/offset paginate, which the schema leaves undocumented.
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 carries the burden. It explains framework_root well (pass the installed Framework root to scan source instead of the catalog), but limit, offset, and query get no treatment at all beyond their conventional names, leaving query's matching semantics 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?
States a specific verb and three concrete resources ('RPC method names, Ruby argument signatures, and authentication requirements'), and explicitly frames the tool as discovery rather than execution. The closing line about the catalog never restricting msf_rpc calls makes the boundary against the sibling msf_rpc 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?
It clearly states the two invocation modes and their defaults: leave framework_root unset to use the pinned catalog, or pass an installed Framework root to scan source instead. It also warns this is 'source discovery, not a live capability probe' so plugins/versions may differ. It stops short of telling the agent when in a workflow to call this versus msf_rpc, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_sessionsARead-only
List sessions; use msf_rpc session.* methods to interact with them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the useful note that session interaction lives in msf_rpc, but says nothing extra about output shape, staleness, or session states — acceptable given the output schema exists.
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 short clauses, zero waste, with the operation front-loaded and the routing hint second. Nothing could be removed without losing information.
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 params, an output schema, and readOnly annotations, this description is sufficient to call the tool correctly. The only mild gap is not clarifying that sessions include shells and Meterpreter channels.
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?
Zero parameters, so the baseline is 4; there is no parameter semantics to add. The description correctly adds no param noise.
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?
Specific verb+resource ('List sessions') that an agent can immediately distinguish from the sibling CRUD-style tools. It doesn't spell out what a session is (Meterpreter/shell) but the operation itself 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?
Explicitly routes interaction work to msf_rpc session.* methods, telling the agent when NOT to use this tool. It lacks an explicit 'use this when you want an overview of active sessions' framing, but the boundary is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msf_statusBRead-only
Authenticate and get Metasploit and API version information.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and network exposure are covered. The description adds that the call performs authentication and returns version metadata, but leaves unclear whether auth state is cached for later calls or whether credentials come from server config — and 'authenticate' sits in mild tension with readOnlyHint without being explained.
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 filler, appropriate for a no-argument status call. It is arguably over-terse: the 'Authenticate' half is the most consequential behavior and receives no elaboration.
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?
An output schema exists, so return values need no explanation, and the empty input schema is trivially complete. What is missing is the operational context an agent needs: whether calling this establishes auth for subsequent msf_* calls, and whether it is a mandatory first step.
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?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. It could still note that credentials come from configuration rather than arguments, which would have made the empty schema less surprising.
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 two concrete operations (authenticate, retrieve Metasploit/API version info) with a specific resource, so an agent knows exactly what it returns. It does not distinguish itself from siblings such as msf_rpc_methods or msf_rpc, which also probe server-side capability, so it stops short of a 5.
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?
There is no explicit when-to-use statement, no mention that this should be called before other msf_* tools, and no named alternative. The word 'Authenticate' only hints at a setup role; an agent must infer ordering and prerequisites on its own.
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.
23 tool updates
v0.1.0- First observed
msf_console_create - First observed
msf_console_destroy - First observed
msf_console_list - First observed
msf_console_read - First observed
msf_console_write - First observed
msf_file_list - First observed
msf_file_read - First observed
msf_file_write - First observed
msf_jobs - First observed
msf_module_execute - First observed
msf_module_info - First observed
msf_module_search - First observed
msf_process_close - First observed
msf_process_list - First observed
msf_process_read - First observed
msf_process_resize - First observed
msf_process_signal - First observed
msf_process_start - First observed
msf_process_write - First observed
msf_rpc - First observed
msf_rpc_methods - First observed
msf_sessions - First observed
msf_status
TDQS
Scored across 23 tools
Tools are organized into clean families (console, process, file, module, RPC) with descriptions that explicitly distinguish risky pairs, e.g. msf_console_* (RPC daemon state) vs msf_process_* (local PTY executables). The remaining overlap is intentional: msf_rpc is a documented catch-all that can do most of what msf_sessions, msf_jobs, msf_status, and msf_module_execute do, which can tempt misselection but is clearly framed as an escape hatch.
Nearly all tools follow a predictable msf_<family>_<verb> snake_case pattern (msf_console_create, msf_process_signal, msf_file_read, msf_module_execute). A few are bare nouns without a verb (msf_sessions, msf_jobs, msf_status, msf_rpc), a minor deviation but still readable and unambiguous within their families.
23 tools is on the heavy side, but the count is driven by a few genuinely stateful subsystems (7 process lifecycle tools, 5 console tools) where read/write/signal/close genuinely each earn a place. No tool appears redundant or filler; a slightly flatter surface could merge some list-only endpoints.
Core areas are covered (module search/info/execute, console lifecycle, process and file I/O), but sessions and jobs are list-only and must be driven through raw msf_rpc for interaction, stopping, or data read — a notable gap in the typed surface for Metasploit's central post-exploitation workflow. File tools also lack delete/move, though the generic RPC escape hatch prevents true dead ends.
Maintenance
Related MCP Connectors
Context and control for any AI. Agent identity, scoped access, and proof across tools.
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables secure integration with Metasploit Framework for AI assistants, providing comprehensive access to penetration testing tools, module management, payload generation, and database operations. Designed for authorized security testing and defensive analysis with 28 specialized tools covering complete MSF functionality.8MIT
- -licenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to interact with Metasploit Framework through 28 comprehensive tools for penetration testing and security analysis. Provides secure, structured access to MSF modules, database operations, session management, and payload generation capabilities.2-
- AlicenseNot gradedqualityDmaintenanceBridges large language models with the Metasploit Framework to enable natural language control over penetration testing workflows. It provides tools for searching modules, executing exploits, generating payloads, and managing active sessions.1Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables interaction with Metasploit Framework via the msfrpc protocol, exposing tools for module management, session control, and exploitation through MCP.35 PyPIMIT