dopesecurity-mcp-server
The Dope MCP is a local Model Context Protocol server that lets an AI assistant talk to your dope.security tenant — look at endpoints, read and tweak policies, and curate custom URL categories. It wraps most of the Flightdeck partner API, runs on your machine, and is read-only out of the box: nothing changes in your tenant until you explicitly turn writes on. It's currently in beta, we hope you enjoy using it.
Installation
Installation is via uvx.
Runs the server on demand. Nothing is installed globally.
Prerequisites
-
Install
uv— see Astral's install guide. -
Install a Python runtime with
uv:uv python install 3.11
MCP client config
Add the server to your MCP client configuration:
{
"mcpServers": {
"dope-security": {
"command": "uvx",
"args": ["dopesecurity-mcp-server"],
"env": {
"DOPE_CLIENT_ID": "your-client-id",
"DOPE_CLIENT_SECRET": "your-client-secret",
"DOPE_ENABLE_MUTATIONS": "false",
"DOPE_ENABLE_DESTRUCTIVE": "false"
}
}
}
}
Three tiers of access
The tool surface is gated by two environment variables, both false
by default. Tools that aren't enabled by the active combination are
not registered at all — they don't exist on the MCP wire.
DOPE_ENABLE_MUTATIONS |
DOPE_ENABLE_DESTRUCTIVE |
What the agent can do |
|---|---|---|
false |
false |
Read-only. Inspect endpoints, policies, custom categories. Cannot modify the tenant. |
true |
false |
Read + write. Per-entry creates, updates, upserts, assigns, unassigns, and per-entry deletes. Cannot drop a whole policy or wipe a section. |
true |
true |
Read + write + destructive. Adds whole-policy drops, whole-section resets to base, whole-custom-category deletes, and wipe-all-URLs. |
false |
true |
Invalid — the server refuses to start. |
Flightdeck RBAC still applies on top of whichever tier you enable: even when a tool is registered, Flightdeck may reject the call because your OAuth client's role doesn't permit it. Start with read-only, flip to mutations when you trust the agent's workflow, and only enable destructive when you explicitly want the agent to be able to start over.
Configuration reference
| Env var | CLI flag | Default | Description |
|---|---|---|---|
DOPE_CLIENT_ID |
— | — | API client ID issued from the dope console. Required. |
DOPE_CLIENT_SECRET |
— | — | API client secret issued from the dope console. Required. |
DOPE_ENABLE_MUTATIONS |
--enable-mutations |
false |
Expose write tools that modify tenant state. |
DOPE_ENABLE_DESTRUCTIVE |
--enable-destructive |
false |
Additionally expose destructive tools (whole-policy drops, whole-section resets). Requires mutations. |
DOPE_TIMEOUT_SECONDS |
--timeout-seconds |
30 |
HTTP timeout for Flightdeck calls. |
DOPE_LOG_LEVEL |
--log-level |
INFO |
Log verbosity (logs go to stderr only). |
DOPE_CLIENT_ID and DOPE_CLIENT_SECRET should be provided as
environment variables. You can grab the credentials from the
dope console.
Available tools
Endpoints (read-only)
| Tool | Description |
|---|---|
search_endpoints |
List or search endpoints (cursor paged). |
Policies (read)
| Tool | Description |
|---|---|
list_policies |
List all policies. |
get_policy_assignments |
Show users/groups assigned to a policy. |
get_policy_restrictions |
Show per-category restrictions. |
get_policy_exceptions |
Show per-category exceptions. |
get_policy_url_bypass |
List URL bypass entries. |
get_policy_application_bypass_entries |
List application bypass entries. |
Policies (write — only when mutations enabled)
| Tool | Description |
|---|---|
create_policy |
Create a new policy. |
assign_policy_principals |
Add users/groups to a policy. |
unassign_policy_principals |
Remove users/groups from a policy. |
update_policy_restrictions |
Update per-category restrictions. |
replace_policy_category_exceptions |
Replace exceptions for the submitted category. |
upsert_policy_url_bypass |
Add or update URL bypass entries. |
delete_policy_url_bypass_entries |
Delete named URL bypass entries. |
upsert_policy_application_bypass |
Add or update application bypass entries. |
delete_policy_application_bypass_entries |
Delete named application bypass entries. |
Policies (destructive — only when both mutations and destructive are enabled)
| Tool | Description |
|---|---|
delete_policy |
Delete a whole policy. |
reset_policy_restrictions_to_base |
Reset all restrictions to Base. |
reset_policy_url_bypass_to_base |
Reset URL bypass to Base. |
reset_policy_application_bypass_to_base |
Reset application bypass to Base. |
Custom categories (read)
| Tool | Description |
|---|---|
list_custom_categories |
List all custom categories. |
get_custom_category_urls |
List URLs in a custom category. |
Custom categories (write — only when mutations enabled)
| Tool | Description |
|---|---|
create_custom_category |
Create a new custom category. |
add_urls_to_custom_category |
Add URLs to a custom category. |
delete_single_url_from_custom_category |
Remove one URL from a category. |
Custom categories (destructive — only when both mutations and destructive are enabled)
| Tool | Description |
|---|---|
delete_custom_category |
Delete a whole custom category. |
delete_all_urls_from_custom_category |
Wipe every URL from a category. |
Developing
Setup and verification
From the repository root:
make install # uv sync --locked
make check # lint + typecheck + unit tests
make integration-tests # requires DOPE_MCP_TESTS_CLIENT_SECRET
uv run dopesecurity-mcp-server --help
Run make help to see all available targets.
Known limitations
assign_policy_principalsandunassign_policy_principalsare read-merge-write on top of Flightdeck's overwrite-only assignments endpoint, so concurrent edits to the same policy may be clobbered.- Pagination is cursor-based; the mcp server does not auto-fetch all pages.
Flightdeck routes deliberately omitted from MCP
Some Flightdeck partner API routes are intentionally not exposed as MCP tools and will not be added. This is the list — treat it as a "don't bother proposing this" register.
PUT /custom_categories/{name}/urls— overwrite-all semantics. An agent calling this with a partial list silently destroys every URL it didn't mention. Useadd_urls_to_custom_category,delete_single_url_from_custom_category, anddelete_all_urls_from_custom_categoryinstead, which force the agent to state intent explicitly.
Running a local checkout from an MCP client
To point an MCP client (Amp, Claude Desktop, etc.) at your local checkout
instead of the published uvx package, replace the command/args so the
client launches the server through uv run --directory:
{
"mcpServers": {
"dope-security-dev": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/dopemcp",
"dopesecurity-mcp-server"
],
"env": {
"DOPE_CLIENT_ID": "your-client-id",
"DOPE_CLIENT_SECRET": "your-client-secret",
"DOPE_ENABLE_MUTATIONS": "true",
"DOPE_ENABLE_DESTRUCTIVE": "true",
"DOPE_LOG_LEVEL": "DEBUG"
}
}
}
}
Replace /absolute/path/to/dopemcp with the path to your clone. The MCP
client spawns the server over stdio on demand.
Metadata
Release files for dopesecurity-mcp-server 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| dopesecurity_mcp_server-0.2.0.tar.gz | 29.7 kB | With provenance | Details for dopesecurity_mcp_server-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dopesecurity_mcp_server-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for dopesecurity_mcp_server-0.2.0-py3-none-any.whl |
Total release size: 69.2 kB
Release files / dopesecurity_mcp_server-0.2.0.tar.gz
| Download URL | dopesecurity_mcp_server-0.2.0.tar.gz |
|---|---|
| Size | 29.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a1ab3fb672869a083dc63146d0bcaa8e69d8035a51b2e5c3a1ea399696c9979c
|
|
BLAKE2b-256 checksum How to use checksums |
ae26c17ec37387b07654b8a7d42adcfaab081bdfca07a06424ec63771ef93313
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.
Transparency logRelease files / dopesecurity_mcp_server-0.2.0-py3-none-any.whl
| Download URL | dopesecurity_mcp_server-0.2.0-py3-none-any.whl |
|---|---|
| Size | 39.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4c4ad5cb06f63200d152cf4585eb0384e43caa050cfab77f7093684136e34262
|
|
BLAKE2b-256 checksum How to use checksums |
690a2c74eeb1b57449a2540adabca3377df71a537f6b7bec6d8aa45e1d244892
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.
Transparency logSecurity for dopesecurity-mcp-server 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for dopesecurity_mcp_server-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.