rotascale-mcp
Govern any agent that speaks the Model Context Protocol — including agents whose code you cannot touch.
pip install rotascale-mcp
Two surfaces, and the difference is the whole point
rotascale-mcp |
rotascale-mcp-proxy |
|
|---|---|---|
| How it is reached | the agent decides to call a governance tool | every tool call passes through it |
| Can the agent avoid it | yes | no |
| Enforcement | advisory | in the tool path |
Only the proxy is a control. The server surface is genuinely useful — real
evidence, and a real gate for an agent that cooperates — but an agent that never
calls authorize_action is not governed by it. We would rather say that plainly
than let you find out during an incident.
Rotascale as an MCP server
Adds governance tools to any MCP host. The agent chooses when to call them.
{
"mcpServers": {
"rotascale": {
"command": "rotascale-mcp",
"env": {
"ROTASCALE_URL": "https://rotascale.acme.internal",
"ROTASCALE_API_KEY": "rota_live_…"
}
}
}
}
| Tool | When the agent calls it |
|---|---|
open_trajectory |
once, at the start of a task |
authorize_action |
before any consequential action — moving money, changing a record, contacting a person |
witness_step |
as it reads and acts; kind="retrieval" is what carries taint |
check_authority |
to see what it may do and what budget remains |
close_trajectory |
when the task ends, success or failure |
authorize_action returns an outcome, not a boolean
Six outcomes, each with a different remedy, and a guidance string written for
a model to act on:
| Outcome | What it means |
|---|---|
allow |
proceed |
deny |
outside the granted authority — do not retry, do not route around |
exhausted |
budget or call allowance spent — retrying cannot help |
gated |
the context is tainted and this authority needs a clean one |
review_sync |
a human must decide first |
review_async |
proceed, but it is queued for review |
A boolean would collapse these, and an agent that cannot tell exhausted from
gated will do the wrong thing about both — usually retrying, which is useless
for the first and a security problem for the second.
Transport
stdio by default, because that is how MCP hosts launch a local server. Logging goes to stderr, since stdout is the protocol channel.
ROTASCALE_MCP_TRANSPORT=streamable-http rotascale-mcp
Why a separate package
pip install rotascale must never carry an MCP dependency, and the MCP spec
revises on its own schedule. Pinning them together would force pointless
releases of one to keep up with the other.
Tracking MCP servers you already use
Separate from this package: the rotascale SDK's watch_mcp wraps an MCP
client session and reports each server's tool manifest, so a tool whose
description changes is caught — including between sessions. A description is
an instruction the model reads, so rewriting one changes what your agent does
without changing a line of your code.
from rotascale.middleware import watch_mcp
session = watch_mcp(session, server="filesystem", transport="stdio")
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rotascale_mcp-0.1.0.tar.gz.
File metadata
- Download URL: rotascale_mcp-0.1.0.tar.gz
- Upload date:
- Size: 87.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46ebf62fd949c022ba3da7c9257e20d8aa047d6910b732f03f87e73b9050d13e
|
|
| MD5 |
50d9d7eaa9b2caccc945c93ee18d013d
|
|
| BLAKE2b-256 |
56303bbf8e41a018780cfd346586058d7bfbe4e21219ce878b4af07b28c5ccd5
|
File details
Details for the file rotascale_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: rotascale_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 19.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
419cee713cf70b3ce7cc45c3cf708150c013e9ef6c966187e606eb5e4e5af258
|
|
| MD5 |
eec436e522c44bccffe6e106e791738a
|
|
| BLAKE2b-256 |
0ce11290821221150e1cfb4289b9299a4b3e9a2dce0641a35a6d4e27f7b460eb
|