portveil-mcp
Control and inspect Portveil VPN devices, locations, and activity from an AI assistant.
View devices, locations, account plan/usage, and recent activity (read-only).
Check a device’s protection status, exit location, live speed, rotation schedule, and last report.
Move a device to a country, city, region, or location ID, with exit-server verification.
Rotate a device once to the next location.
Start or stop automatic rotation every 5–10080 minutes, optionally among chosen locations.
Reconnect or disconnect a device’s VPN tunnel; disconnect is destructive and requires confirmation.
Add devices: WireGuard phone/laptop devices (saves tunnel files locally) or Linux/agent machines (returns setup commands).
Rename devices and enable/disable remote control.
Remove devices permanently; this is destructive and requires confirmation.
Actions require appropriately scoped tokens: read, control, or admin.
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., "@portveil-mcpMove my scraper box to Finland."
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.
Portveil MCP server
Let an AI assistant see the devices on your Portveil account and move them between VPN locations.
"Move my scraper box to Finland." "Rotate every agent to a new location." "Which of my devices aren't protected right now?" "Rotate the scraper between the US and Finland every 15 minutes."
Moves are verified: a tool only reports success after the device has switched and the exit server in the new location confirms it sees that device.
Tools
Tool | What it does | Needs |
| Every device: protected or not, where it exits, live speed (↓/↑ Mbps), remote control on/off | read |
| The locations you can move to | read |
| One device's current state, including live speed and any rotation | read |
| Plan and devices used | read |
| Recent moves, reconnects and changes, and which token made them | read |
| Move a device to a country or city ("Finland", "US", "Helsinki") | control |
| Move a device once to the next location | control |
| Move a device automatically every N minutes (5–10080), optionally among chosen locations. Portveil runs the schedule, so the assistant can close | control |
| Turn scheduled rotation off | control |
| Re-establish a device's tunnel | control |
| Turn a device's VPN off (flagged destructive: a hint that tells well-behaved assistants to check with you first) | control |
| Add a device. Phones and laptops (WireGuard app): creates it and saves its tunnel files locally, key never shown in chat. Linux servers and agent machines: gives the exact commands to run on that machine, which makes its own key and registers itself | admin (phones/laptops) |
| Rename a device and/or turn its remote control on or off | admin |
| Remove a device for good (flagged destructive) | admin |
Tool names changed in 0.3.0 to one verb_noun pattern: device_status → get_device, account_info → get_account, recent_activity → list_activity, set_rotation → start_rotation.
Devices can be named loosely ("scraper" finds "Scraper box"); an ambiguous name returns the choices instead of guessing.
Related MCP server: tailscale-blade-mcp
Setup
No account yet? Start free with just an email, no card.
In the Portveil dashboard, create an API token. Choose control scope to let the assistant move devices, or read to let it only look. Don't give it your account key.
Note your account ID (
acct_…).Add the server to your assistant:
Claude Code
claude mcp add portveil -e PORTVEIL_ACCOUNT_ID=acct_… -e PORTVEIL_TOKEN=clt_… -- npx -y portveil-mcpClaude Desktop (claude_desktop_config.json), Cursor (.cursor/mcp.json) and most other clients:
{
"mcpServers": {
"portveil": {
"command": "npx",
"args": ["-y", "portveil-mcp"],
"env": { "PORTVEIL_ACCOUNT_ID": "acct_…", "PORTVEIL_TOKEN": "clt_…" }
}
}
}Hermes Agent: Hermes only installs npm packages older than 14 days, so install into its own folder and run it with node:
cd ~ && npm install --prefix ~/.hermes/mcp-servers/portveil portveil-mcp@0.4.3
echo 'PORTVEIL_TOKEN=clt_…' >> ~/.hermes/.env
hermes mcp add portveil --command node \
--env PORTVEIL_ACCOUNT_ID=acct_… 'PORTVEIL_TOKEN=${PORTVEIL_TOKEN}' \
--args ~/.hermes/mcp-servers/portveil/node_modules/portveil-mcp/dist/index.jsFor Hermes to use it well (when to act, what to confirm first, how to add devices), also install the Portveil skill from ClawHub:
hermes skills install roybogs/portveil(Source: skills/portveil/SKILL.md.)
Devices must be running the Portveil app or the Portveil agent with remote control on. Devices using the plain WireGuard app are shown but can't be moved.
Security
Use a scoped API token. Every action it takes is recorded in your account's activity log with the token that made it, and you can revoke it in the dashboard at any time.
The server talks only to
https://api.portveil.com(override withPORTVEIL_API). It stores nothing.
Development
npm install
npm test # builds, then runs the tests against a fake Portveil APIAvailable Tools
14 toolsadd_deviceAdd deviceA
Add a new device to the account. kind "phone_or_computer" (iPhone, Android, Mac, Windows using the WireGuard app): creates the device now and saves one WireGuard tunnel file per location, with a private key made locally, into a folder on the machine running this MCP server; the key is never shown in the reply. Import a file in the WireGuard app to connect. These devices are view-only: they can't be moved remotely. kind "linux_machine" (a server or the machine an agent runs on): returns the exact commands to run as root on that machine; it makes its own key and registers itself, and can then be moved, rotated and switched with the other tools. Uses one device slot (see get_account). Needs an admin-scope token for phone_or_computer.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | phone_or_computer: WireGuard app on a phone or laptop. linux_machine: a Linux server or agent machine running the Portveil agent | |
| name | Yes | Display name for the new device, e.g. "Miguel iPhone" or "scraper-box" | |
| folder | No | phone_or_computer only: folder to save the tunnel files in. Default ~/Portveil/<name> | |
| split_tunnel | No | linux_machine only, advanced: default false (full tunnel), which sends everything the machine connects to through Portveil and keeps SSH and other incoming connections on their normal route, so remote servers stay reachable. true only reaches Portveil's own network: the machine's internet traffic would NOT go through Portveil | |
| temporary_minutes | No | phone_or_computer only: delete the device automatically after this many minutes (5 to 43200, i.e. 30 days). Omit for a permanent device |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Substantial disclosure beyond the annotations: the private key is generated locally and never returned in the reply, files land in a folder on the MCP host, phone_or_computer devices are view-only and cannot be moved, linux_machine devices self-register and become rotatable, one device slot is consumed, and an admin-scope token is required for the first kind. Also covers the delayed self-deletion of temporary devices.
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 clause, and every subsequent sentence carries operational information (file output, key handling, moveability, slot usage, auth scope). It is dense and longer than typical, but almost no sentence is filler; a slight trim of the kind restatements would help.
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 5-parameter mutation tool with no output schema, the description still tells the agent everything needed to call it correctly: which kind to pick, what side effects occur on the local filesystem, what is returned (commands vs. tunnel files, never the key), auth requirements, and capacity implications.
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 100%, so the baseline is 3, but the description adds consequences the schema only hints at — what each kind produces mechanically, that kind selection determines move/rotate eligibility, and that slot budget is affected. It does not restate folder defaults or split_tunnel routing details, which the schema already handles well.
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 ("Add a new device to the account") and then splits the operation into its two mutually exclusive kinds, explaining what each actually produces (local WireGuard tunnel files vs. root-run commands). An agent can distinguish this from get_device/list_devices/move_device immediately.
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 clear selection guidance between the two kinds (phone/laptop with the WireGuard app vs. Linux server or agent host) and points to get_account for slot consumption. It does not explicitly state when to use update_device or move_device instead, but the mute/edit distinction is conveyed by "view-only: they can't be moved remotely."
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disconnect_deviceDisconnect deviceADestructiveIdempotent
Turn off a device's VPN tunnel. Its traffic stops going through Portveil (and loses VPN protection) until it reconnects. The device stays on the account. Confirm with the user first. Needs a control-scope token and a Portveil-agent device.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | Which device: its name, a unique part of its name (e.g. "scraper"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true, and the description adds real context on top: exactly what breaks (traffic stops traversing Portveil, VPN protection is lost), what survives (device remains on the account), and that it self-restores on reconnect. It also discloses auth requirements (control-scope token, Portveil-agent device) and mandates user confirmation, none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each earning its place: effect, consequence, scope, prerequisite. The core effect is front-loaded in the first clause and nothing is padded or restated.
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, idempotent mutation with no output schema, the description covers effect, reversibility, and the human-in-the-loop requirement. It does not say what the call returns (e.g., the resulting device state), which is the only notable omission.
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 schema covers the single `device` parameter at 100%, including accepted formats, case-insensitivity, and a pointer to list_devices, so the description has nothing to compensate for. Baseline 3 applies since the description adds no parameter detail of its own.
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?
"Turn off a device's VPN tunnel" is a specific verb+resource, and the follow-up sentences disambiguate it from the nearest siblings: the device is not removed from the account (vs remove_device) and traffic resumes when it reconnects (vs reconnect_device). An agent can distinguish this from every sibling without opening a 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?
It gives an explicit procedural precondition ("Confirm with the user first") and states the key scoping fact ("The device stays on the account"), which implicitly routes removal requests to remove_device. It does not name sibling alternatives outright, so the routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountGet accountARead-only
Get the account's plan and how many devices it uses out of its limit. Use it when asked about the plan or before suggesting adding devices. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already marks this as safe, and the description's 'Read-only' restates that rather than adding new behavioral context. It does not disclose auth requirements, rate limits, or response shape details, but with annotations covering the safety profile, a mid score is appropriate.
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 deliver the purpose, output summary, usage trigger, and safety trait without any wasted words. The key scoped information is front-loaded.
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 zero-parameter read-only tool with annotations already covering safety, the description fully states what the agent will learn (plan and device usage against limit) and when to call it. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so there is no parameter ambiguity. The description adds useful context about what the result will contain, which is sufficient for an empty-parameter tool.
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 names a specific verb, resource, and output: getting the account's plan and device usage against its limit. It is clearly distinct from the sibling tools, which all operate on devices or activities.
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 explicitly states when to use the tool: when asked about the plan or before suggesting adding devices. This gives the agent actionable selection criteria without ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deviceGet deviceARead-only
Get one device's current state: online or offline, the location it exits from, whether that exit server confirms the tunnel, its live speed, any rotation schedule, whether an agent machine's clock matches its exit's timezone, and when it last reported. Use it to check a device before or after an action. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | Which device: its name, a unique part of its name (e.g. "scraper"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds useful behavioral context by enumerating the live state fields returned (online status, exit location, tunnel confirmation, speed, rotation, clock match, last report). The trailing 'Read-only' repeats the annotation, and no permissions or rate limits are mentioned, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and the return-field enumeration is dense but necessary because there is no output schema. The only minor waste is the final 'Read-only', which duplicates the readOnlyHint annotation.
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 a single-device read tool with a fully described parameter, read-only annotations, and no output schema, the description is complete: it explains what state is returned, when to use it, and that it is read-only.
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 100%, and the device parameter is fully documented in the schema with accepted formats and how to obtain names/IDs. The description adds no parameter-level meaning beyond what the schema already provides, so the baseline of 3 is appropriate.
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: 'Get one device's current state', then enumerates the exact state fields returned. 'One device' implicitly distinguishes it from sibling list_devices, and an agent can tell what the tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: 'Use it to check a device before or after an action.' However, it does not explicitly name alternatives (such as list_devices for listing all devices) or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_activityList activityARead-only
List recent actions on the account (moves, reconnects, rotations, renames, tokens created), newest first, with the token that made each. Use it to answer "what changed?" or to audit an assistant's actions. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many entries to return, newest first (1–100, default 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the trailing 'Read-only' is redundant and earns no credit. Beyond that, the description genuinely adds behavior: results are ordered newest first and each entry carries the token that performed the action. It does not say whether history is bounded or how far back it goes, keeping it at 4.
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 clauses, front-loaded with the verb and resource, then the payload contents, then the use case. Only the closing 'Read-only' duplicates the annotation, a minor cost against otherwise zero-waste prose.
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-optional-parameter read tool with no output schema, the description covers what is returned (action types plus the acting token) and the ordering, so an agent can call it competently. Retention window and absence of time-range filtering are unstated, a small 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?
Schema coverage is 100%, so the single 'limit' parameter is already fully documented including the 1–100 range and default. The description only echoes the newest-first ordering, which the schema also states, so baseline 3 applies.
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 recent actions on the account') and enumerates the action types it covers (moves, reconnects, rotations, renames, tokens created), which separates it from list_devices/get_device by making clear it is an audit trail rather than a resource listing. Sibling names are not cited explicitly, so it falls just 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?
Gives concrete use cases: answering 'what changed?' and auditing an assistant's actions. That is a clear context for selection, but it names no alternative tool or exclusion (e.g. when to prefer get_device for current state), so it stops at a strong 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesList devicesARead-only
List every device on the Portveil account, one line each: whether it's protected (connected AND confirmed by the exit server), which country it exits from, its live download/upload speed while connected, and whether it accepts remote control. Use this first to see what's there or to find a device's exact name; use get_device for one device. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the read-only nature is known. The description adds value by disclosing the output content (one line per device with protected status, exit country, speeds, remote control acceptance) and confirming it is read-only, which goes beyond the annotation's generic safety signal.
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 sentences with no fluff. The first sentence states the purpose and scope, the second provides usage guidance. All information is front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no parameters and no output schema, the description covers the essential aspects: what it lists, the fields returned, and when to use it. It does not mention edge cases like pagination or authentication, but these are not critical for a simple listing operation and are not expected given the annotation coverage.
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 has zero parameters, and the schema coverage is trivially 100%. With no parameters to describe, the baseline is 4; the description does not need to add parameter semantics since there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'every device on the Portveil account', and enumerates the specific fields returned (protected status, country, speeds, remote control). It also distinguishes itself from get_device by explicitly naming it for single-device lookups, so an agent can tell them apart without opening schemas.
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 explicit guidance: 'Use this first to see what's there or to find a device's exact name; use get_device for one device.' This names the alternative and the condition that selects it, leaving no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_locationsList locationsARead-only
List the exit locations (country, city and location ID) that devices can be moved to, with each one's timezone and language settings. Use it before move_device or start_rotation when you're unsure what's available, or to make a browser on a moved machine match its exit (sites compare the browser's timezone with its IP's country). Every plan can use every location. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description confirms 'Read-only.' It adds genuinely new behavioral context: 'Every plan can use every location' removes a permission/plan-gating concern the annotations do not cover, and it explains why timezone/language matter. No contradiction, though nothing is said about result size or ordering.
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 definition, then usage guidance, then plan availability. The browser-timezone sentence is longer than strictly necessary but does earn its place by justifying why the timezone field is returned.
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 parameters and no output schema, the description carries the burden and does so: it lists the returned fields, the plan-access rule, and the downstream tools that consume this data. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description documents the shape of what is listed (country, city, location ID, timezone, language), which is helpful for interpreting results even though there are no inputs to explain.
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 the exit locations') and enumerates the returned fields (country, city, location ID, timezone, language), which clearly separates it from siblings like list_devices. An agent knows exactly what this returns without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names two dependent tools (move_device, start_rotation) and the condition for calling this first ('when you're unsure what's available'), plus a second concrete scenario about matching browser timezone to exit IP. Both when-to-use and the alternative downstream tools are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_deviceMove deviceAIdempotent
Move a device's traffic to exit from a chosen location. Waits until the device switches and the new exit server confirms it (usually 10–30 s), and says plainly if that didn't happen. Safe to repeat: moving to where it already is does nothing. Only works on machines running the Portveil agent with remote control on (phones using the WireGuard app switch on the device itself). Needs a control-scope token. To just go somewhere different, use rotate_device.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | Which device: its name, a unique part of its name (e.g. "scraper"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices. | |
| location | Yes | Where to exit: a country, city or region ("Finland", "US", "Helsinki") or a location ID from list_locations (e.g. srv-eu-1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false; the description goes further by explaining what idempotency means in practice ('moving to where it already is does nothing'), how long the call blocks (10–30 s), that it verifies against the new exit server, and that it reports failure plainly. It also discloses the auth requirement (control-scope token) and the agent/remote-control prerequisite, which annotations do not cover.
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?
Five tight sentences, front-loaded with purpose and wait behavior, then idempotency, then preconditions, then the routing hint. Every sentence carries distinct, non-redundant information and nothing is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers latency, verification, failure reporting, idempotency, preconditions, and auth scope — everything an agent needs to call it safely and set expectations. Nothing material is left to inference.
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 100% and both parameters are richly documented (name/partial-name/ID, case-insensitivity, location names vs srv- IDs, cross-references to list_devices and list_locations). The description adds no parameter-level detail beyond that, so the baseline of 3 applies.
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 object ('Move a device's traffic to exit from a chosen location') and explicitly names the sibling it is not: 'To just go somewhere different, use rotate_device.' An agent can distinguish this from rotate_device, reconnect_device, or update_device without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (rotate_device) and the condition that selects it, plus an explicit exclusion: only machines running the Portveil agent with remote control on, and phones using the WireGuard app must be switched on the device itself. Preconditions and the fallback path are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reconnect_deviceReconnect deviceAIdempotent
Tell a device to re-establish its VPN tunnel at its current location, without moving it. Use when it shows connected but not confirmed, or traffic seems stuck. Traffic may pause for a few seconds. Needs a control-scope token and a Portveil-agent device.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | Which device: its name, a unique part of its name (e.g. "scraper"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context annotations do not cover: traffic pauses for a few seconds, a control-scope token is required, and the device must be a Portveil-agent. This is exactly the operational context an agent needs before triggering a non-read-only, idempotent reconnection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action before the trigger conditions and side effects. Every sentence carries distinct information: behavior, usage, disruption, prerequisites.
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 single-parameter mutation with no output schema, the description covers side effects, auth scope, and device-type constraints. It does not indicate what a successful result looks like or what happens on failure, which is a small 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?
Schema description coverage is 100%, and the schema already explains that 'device' accepts a name, partial name, or dev_ ID, is case-insensitive, and can be sourced from list_devices. The description adds no parameter detail beyond that, so the baseline 3 applies.
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 ('Tell a device to re-establish its VPN tunnel') and immediately distinguishes itself from move_device with 'at its current location, without moving it'. An agent can tell exactly what this does and how it differs from the closest sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions ('connected but not confirmed, or traffic seems stuck') and excludes the move case. Preconditions (control-scope token, Portveil-agent device) are spelled out. It stops short of naming when to prefer disconnect_device or rotate_device instead, so a 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_deviceRemove deviceADestructive
Permanently remove a device from the account: its VPN key stops working at every exit and its slot is freed. It can't be undone; the device would have to be set up again. Confirm with the user first, naming the device. Needs an admin-scope token.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | Which device: its name, a unique part of its name (e.g. "scraper"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false; the description goes well beyond them by spelling out the blast radius (key stops working at every exit, slot is freed), irreversibility ("can't be undone; the device would have to be set up again"), and the auth requirement (admin-scope token). That is exactly the added context the annotation bar leaves room for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences: purpose and effect first, then irreversibility, then the confirmation requirement, then auth. Every sentence carries information an agent would otherwise have to guess, and nothing is repeated from the schema.
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 no output schema, the description covers the outcome, the irreversibility, the human-confirmation safety step, and the token scope. An agent has everything needed to decide and 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?
Schema coverage is 100% and the schema itself explains name/partial-name/ID matching and points at list_devices, so the description is not obliged to re-document it. "Naming the device" reinforces the confirmation step but adds no new resolution semantics, so this sits at the baseline.
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 ("Permanently remove a device from the account") plus the concrete effect (VPN key stops working at every exit, slot freed). That wording implicitly separates it from the reversible siblings (disconnect_device, move_device), but it never names those siblings, so the differentiation is left to inference rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real preconditions: confirm with the user first and name the device, and an admin-scope token is required. What is missing is an explicit exclusion or alternative — nothing tells the agent to use disconnect_device instead when the intent is temporary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rotate_deviceRotate deviceA
Move a device once to the next location in the list, so its traffic exits from somewhere new. Same checks and waiting as move_device. Each call moves again, so it isn't idempotent. For repeated automatic moves use start_rotation instead. Needs a control-scope token.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | Which device: its name, a unique part of its name (e.g. "scraper"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond annotations: "Same checks and waiting as move_device" discloses a preflight-check plus async-wait pattern, and "Needs a control-scope token" discloses an auth requirement that appears nowhere in the structured fields. The non-idempotency note restates idempotentHint=false, and it does not say what happens when checks fail or how long the wait takes.
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?
Five short sentences, front-loaded with the action and effect, then constraints and the alternative. Every sentence carries distinct information; nothing is 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?
Covers action, idempotency, auth scope, and sibling routing for a one-parameter tool. With no output schema, it would ideally state what is returned after the move (e.g., the new location), but the "traffic exits from somewhere new" framing covers the essential outcome.
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?
Single parameter with 100% schema description coverage; the schema already explains name/partial-name/device-ID matching, case-insensitivity, and where to obtain values. The description adds no parameter-level meaning, which is acceptable at this coverage level.
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 ("Move a device once to the next location in the list") with the observable effect ("traffic exits from somewhere new"). It is clearly distinguishable from move_device (targeted move) and start_rotation (repeated moves) without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to the alternative: "For repeated automatic moves use start_rotation instead," which is exactly the decision an agent faces among these siblings. It also implies a one-shot vs. targeted split against move_device via "same checks and waiting as move_device."
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_rotationStart rotationAIdempotent
Make Portveil move a device to the next location automatically every N minutes, optionally cycling through chosen locations only. Portveil runs the schedule itself, so the assistant doesn't need to stay running. Calling it again replaces the schedule. Stop it with stop_rotation. Needs a control-scope token and a Portveil-agent device.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | Which device: its name, a unique part of its name (e.g. "scraper"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices. | |
| locations | No | Locations to cycle through, e.g. ["US", "Finland"]; at least two. Omit to cycle through every location. | |
| every_minutes | Yes | Minutes between moves: 5 to 10080 (one week) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the schedule is executed server-side so the assistant need not stay running, a repeat call replaces rather than stacks schedules, and control-scope plus agent-device requirements must be met. These are non-obvious operational facts an agent could not infer from readOnlyHint/idempotentHint.
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 tight sentences front-loading what happens, then lifecycle (replace/stop), then prerequisites. No filler and no repetition of annotation-declared safety facts.
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 scheduling mutation with no output schema, it covers persistence semantics, replacement behavior, the stop path, and auth/device prerequisites. An agent has everything needed to decide to call it and what to expect afterwards.
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 100% and each parameter already documents format, bounds (5–10080), and the 'at least two' constraint. The description only restates the interval and the optional location subset, adding no syntax or edge-case detail 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 and resource: 'Make Portveil move a device to the next location automatically every N minutes'. The recurring/automatic framing plus 'optionally cycling through chosen locations only' clearly separates it from the one-off move_device and rotate_device siblings.
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 names the counterpart for teardown ('Stop it with stop_rotation') and states re-invocation replaces the schedule, plus prerequisites (control-scope token, Portveil-agent device). It stops short of directly contrasting with move_device/rotate_device, relying on 'automatically' to imply the distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_rotationStop rotationAIdempotent
Turn off a device's automatic rotation. The device stays at its current location. Safe to call when no rotation is set. Needs a control-scope token.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | Which device: its name, a unique part of its name (e.g. "scraper"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint and destructiveHint=false, but the description adds genuine extra context: the resulting state ('stays at its current location'), the no-op safety behavior, and an auth requirement ('Needs a control-scope token') that appears nowhere in 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 short sentences, front-loaded with the action, then the resulting state, then the safety and auth caveats. Every sentence carries actionable information with 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 single-parameter state-change tool with no output schema, the description covers everything an agent needs: what it does, what the device state becomes after the call, that it's safe when already stopped, and that a control-scope token is required.
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 100% and the single 'device' parameter is fully documented with accepted formats, resolution guidance, and a pointer to list_devices. The description adds nothing beyond what the schema already says, so the baseline of 3 applies.
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: 'Turn off a device's automatic rotation,' which an agent can distinguish from start_rotation or rotate_device by the opposite effect. It stops short of naming those siblings explicitly, so the differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Safe to call when no rotation is set' gives a clear condition under which the tool is still appropriate, which is useful negative-space guidance. It doesn't explicitly contrast with rotate_device or describe when a user would want to stop versus change rotation, leaving a small gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_deviceUpdate deviceAIdempotent
Rename a device and/or turn remote control on or off for it. Turning remote control off stops move, rotate, reconnect and disconnect for that device until it's turned back on. Change only what's given; safe to repeat. Needs an admin-scope token.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New display name, 1–64 characters | |
| device | Yes | Which device: its name, a unique part of its name (e.g. "scraper"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices. | |
| remote_control | No | true lets tokens move and control this device; false blocks it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: disabling remote control has an ongoing downstream effect (blocks move, rotate, reconnect, disconnect until re-enabled), only supplied fields are modified (partial update), and an admin-scope token is required. The 'safe to repeat' claim is consistent with idempotentHint=true and reinforces it rather than merely restating it.
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 tight sentences: action first, consequence second, operational constraints last. No filler, and the highest-risk behavior (disabling remote control) is surfaced early.
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 3-parameter idempotent update with no output schema, the definition covers action scope, side effects, partial-update semantics, repeat safety, and auth requirements. Nothing an agent needs before invoking it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning to remote_control by spelling out what false blocks, and clarifies that omitted fields are left untouched. Name and device semantics are left entirely to the schema, which already documents them well.
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 concrete verbs (rename, turn remote control on/off) against a specific resource (device), which cleanly separates it from the mutating siblings move_device, rotate_device, reconnect_device and disconnect_device. An agent can pick this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Change only what's given' and the note that disabling remote control blocks move/rotate/reconnect/disconnect give clear context for when this tool is the right choice. There is no explicit 'use X instead' routing, but the sibling operations it gates are named, which is nearly as useful.
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.
11 tool updates
v0.4.4- Changed
add_device1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
disconnect_device1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_device1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_activity1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
move_device1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
reconnect_device1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
remove_device1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
rotate_device1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
start_rotation1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
stop_rotation1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
update_device1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
1 tool update
v0.4.3- Changed
add_device1 field changed- changed
Input schema / properties / split_tunnel / descriptionPrevious value: -"linux_machine only: default true, so a remote server keeps its SSH session. false sends all of its traffic through Portveil"New value: +"linux_machine only, advanced: default false (full tunnel), which sends everything the machine connects to through Portveil and keeps SSH and other incoming connections on their normal route, so remote servers stay reachable. true only reaches Portveil's own network: the machine's internet traffic would NOT go through Portveil"
1 tool update
v0.4.1- Added
add_device
14 tool updates
v0.3.0- Removed
account_info - Removed
device_status - Changed
disconnect_device1 field changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name (or part of it, e.g. \"scraper\") or its device ID (dev_…)"New value: +"Which device: its name, a unique part of its name (e.g. \"scraper\"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices."
- Added
get_account - Added
get_device - Added
list_activity - Changed
move_device2 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name (or part of it, e.g. \"scraper\") or its device ID (dev_…)"New value: +"Which device: its name, a unique part of its name (e.g. \"scraper\"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices." - changed
Input schema / properties / location / descriptionPrevious value: -"Where to exit: a country or city (\"Finland\", \"US\", \"Helsinki\") or a location ID (srv-eu-1)"New value: +"Where to exit: a country, city or region (\"Finland\", \"US\", \"Helsinki\") or a location ID from list_locations (e.g. srv-eu-1)"
- Removed
recent_activity - Changed
reconnect_device1 field changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name (or part of it, e.g. \"scraper\") or its device ID (dev_…)"New value: +"Which device: its name, a unique part of its name (e.g. \"scraper\"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices."
- Added
remove_device - Changed
rotate_device1 field changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name (or part of it, e.g. \"scraper\") or its device ID (dev_…)"New value: +"Which device: its name, a unique part of its name (e.g. \"scraper\"), or its device ID (dev_…). Case-insensitive. Get names and IDs from list_devices."
- Added
start_rotation - Added
stop_rotation - Added
update_device
9 tool updates
v0.1.1- First observed
account_info - First observed
device_status - First observed
disconnect_device - First observed
list_devices - First observed
list_locations - First observed
move_device - First observed
recent_activity - First observed
reconnect_device - First observed
rotate_device
TDQS
Scored across 14 tools
Each tool targets a distinct resource+action, and the descriptions explicitly disambiguate the tricky pairs: move_device vs rotate_device (chosen location vs next in list), rotate_device vs start_rotation (one-off vs scheduled), and list_devices vs get_device (all vs one). Even the connect/disconnect/reconnect trio is clearly separated by intent.
Every tool follows a uniform snake_case verb_noun pattern (get_, list_, move_, rotate_, start_, stop_, reconnect_, disconnect_, update_, add_, remove_). The two-word forms like start_rotation/stop_rotation and move_device/rotate_device read as a coherent family.
Fourteen tools sit in the well-scoped range for a device/VPN management server, and each one maps to a real operation (read, lifecycle, scheduling, account, locations). Nothing appears redundant or padding the surface.
Core lifecycle is fully covered: add/get/list/update/remove devices, connect/disconnect/reconnect, move/rotate/schedule, plus account and location lookups and an audit trail. The only visible gap is token management — list_activity reports 'tokens created' but no tool creates, lists, or revokes tokens.
Maintenance
Related MCP Connectors
Connect AI assistants to authorized Windows and macOS devices for files, commands, and management.
Connect AI assistants to explicitly paired computers, servers, and VMs for permitted remote actions.
Device intelligence for AI agents: Fingerprint events, smart signals, and API key management.
Give AI agents secure access to RevDesk calling, SMS, phone numbers, caller IDs, and usage.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables AI assistants to control mobile and desktop devices with natural language, including running automation tasks, taking screenshots, and managing devices.65 npmMIT
- AlicenseAqualityCmaintenanceEnables AI agents to securely interact with Tailscale tailnets for device inventory, ACL review, key hygiene, and more, with token-efficient output and write-gated mutations.19MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage agents, webhooks, and P2P connectivity on the Anycast network, allowing operations like listing agents, creating tokens, and viewing connection stats.4 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to manage VPN infrastructure through provisioning, lifecycle control, traffic routing, and health monitoring.2-