Developer Documentation
Connect an AI assistant to your Secureframe workspace and query or update your compliance data through the Model Context Protocol (MCP).
The Secureframe MCP server allows you to access and manage your Secureframe data — controls, tests, vendors, frameworks, risks, and more — as Model Context Protocol tools. Any MCP-capable client (Claude Code, Claude Desktop, Cursor, and others) can connect, letting you ask an assistant to look things up and take actions on your behalf.
Every request runs as a specific Secureframe user in a specific company and respects that user's existing permissions — the assistant can only see and do what you can.
Use the URL that matches your Secureframe data region:
| Region | MCP URL |
|---|---|
| United States | https://mcp.secureframe.com/ |
| United Kingdom | https://mcp-uk.secureframe.com/ |
The examples below use the US URL — substitute your regional URL if applicable.
There are two ways to authenticate. Both run every request as your Secureframe user, with your existing permissions.
Point your client at the MCP URL with no credentials at all. The first time it connects, it opens your browser, you sign in to Secureframe and approve access, and the client receives its own token. There is nothing to generate, copy, or store yourself, and no secret ends up in a config file.
This is standard OAuth 2.1, so most MCP clients — Claude Code, Claude Desktop, Cursor, MCP Inspector — handle it automatically: they discover the authorization server from the MCP URL and register themselves. See Connecting a client.
For setups with no browser — CI jobs, scripts, servers — authenticate with a Secureframe REST API key and secret.
Generate a key in Secureframe → Company Settings → API keys, then send the key and secret in an
Authorization header, separated by a space:
Authorization: <API_KEY> <API_SECRET>
export SECUREFRAME_API_KEY="your-api-key"
export SECUREFRAME_API_SECRET="your-api-secret"
Then reference those variables when you connect, as shown below.
Add the server with a single command — no credentials:
claude mcp add --transport http secureframe https://mcp.secureframe.com/
Then run /mcp inside Claude Code, select secureframe, and choose
Authenticate. Your browser opens to Secureframe to sign in and approve access, and the
connection completes on its own.
--transport http is required — without it, the CLI treats the argument as a local command to launch.
--scope is optional: it controls where the config is saved — the default (local) applies to the current
project only, while --scope user makes the server available across all your projects.
For clients configured with JSON (Claude Desktop, Cursor, etc.), point an HTTP MCP server at the endpoint:
{
"mcpServers": {
"secureframe": {
"type": "http",
"url": "https://mcp.secureframe.com/"
}
}
}
The client prompts you to sign in the first time it connects.
If your client can't open a browser, supply the API key header directly. For Claude Code, using the environment variables from above:
claude mcp add --transport http secureframe https://mcp.secureframe.com/ \
--header "Authorization: ${SECUREFRAME_API_KEY} ${SECUREFRAME_API_SECRET}"
Or, for a JSON-configured client:
{
"mcpServers": {
"secureframe": {
"type": "http",
"url": "https://mcp.secureframe.com/",
"headers": {
"Authorization": "<YOUR_API_KEY> <YOUR_API_SECRET>"
}
}
}
}
A client configured with an Authorization header never starts the sign-in flow — it uses the key for every request.
These tools wrap the Secureframe REST API. Any query filters and parameters available on an API endpoint are also available on its matching tool — see the full API documentation for details. Connected MCP clients receive each tool's parameter schema automatically, so your assistant knows what inputs a tool accepts without any extra setup.
Get a Cloud Resource
List Cloud Resources
Update a Cloud Resource
Create Framework Asset Scope
List Framework Asset Scopes
Create a Comment
Delete a Comment
Get a Comment
List Comments
Update a Comment
Get a Control
List Controls
Publish data
Get a Device
List Devices
Create Framework Asset Scope
List Framework Asset Scopes
Get an Evidence
List Evidence
Stage a file so its bytes go straight to storage rather than through this API, and get back an id to attach it with. Uploading a file takes three steps, and only the first and third are tools — the middle one you make yourself. 1. Call this tool with the file's `filename`, `byte_size` and `checksum`. The response contains a `url`, a `headers` object, and an `id`. 2. PUT the file's bytes to that `url`, sending every entry in `headers` as a header, unaltered. The request body is the file's contents as they are on disk — raw bytes, not base64, not multipart, not wrapped in JSON — so there is nothing to encode or convert. Storage rejects the PUT unless the bytes match the `byte_size` and `checksum` declared in step 1, so declare them from the file you are actually sending. 3. Pass the `id` as `upload_id` to the tool that attaches it: `create_test_evidence`, `create_user_evidence` or `update_trust_center_request`. Each `id` is redeemable once; attaching the same file again means staging it again from step 1. A file must be 32 MB or smaller. A larger `byte_size` is refused here, in step 1, before you have spent anything on the upload itself. The two halves of the handshake expire apart, and the response dates both. The `url` stops being accepted 15 minutes after staging, at `url_expires_at`; the `id` stays redeemable for an hour, until `id_expires_at`. Bytes that have already landed can therefore still be attached after the URL is dead, but a batch of uploads staged up front must all be PUT inside that first 15 minutes.
Get a Framework
List Frameworks
Get a Framework Requirement
List Framework Requirements
Archive an Integration Connection
Get an Integration Connection
List Integration Connections
Create a Knowledge Base Answer
Delete a Knowledge Base Answer
Get a Knowledge Base Answer
Update a Knowledge Base Answer
Create a Knowledge Base Question
Delete a Knowledge Base Question
Get a Knowledge Base Question
Update a Knowledge Base Question
Create a POA&M item
Discard a POA&M item
Get a POA&M item
List POA&M items
Update a POA&M item
Get a Policy
List Policies
Get a Repository
List Repositories
Update a Repository
Create Framework Asset Scope
List Framework Asset Scopes
Get a Risk
List Risks
Create an SSP Duty
Delete an SSP Duty
Get an SSP Duty
List SSP Duties
Update an SSP Duty
Create an SSP Duty Role
Delete an SSP Duty Role
Get an SSP Duty Role
List SSP Duty Roles
Create an SSP Policy
Delete an SSP Policy
Get an SSP Policy
List SSP Policies
Update an SSP Policy
Create an SSP Report
Get an SSP Report
List SSP Reports
Get an SSP Report Assessment Objective
List SSP Report Assessment Objectives
Update an SSP Report Assessment Objective
Get an SSP Report Section
List SSP Report Sections
Update an SSP Report Section
Get an SSP Report Section Block
List SSP Report Section Blocks
Update an SSP Report Section Block
Create a SSP Role
Delete a SSP Role
Get a SSP Role
List SSP Roles
Update a SSP Role
Create an SSP Vendor
Delete an SSP Vendor
Get an SSP Vendor
List SSP Vendors
Update an SSP Vendor
Create a Security Questionnaire
Get a Task
List Tasks
Create a Test
Get a Test
List Tests
Update a Test
Attach an evidence file to a Test. The bytes are not sent here. Stage the file first with the `create_file_upload` tool, which hands back a `url` and an `id`; PUT the file's raw bytes to that `url`; then call this tool with that `id` as `upload_id`. The bytes must already be in storage by the time you call this — an `upload_id` whose PUT never happened is refused rather than attached empty. `create_file_upload` documents the size limit and the two expiry windows. Each `upload_id` is redeemable once. Attaching the same file to a second Test means staging it again.
Create a Test Export
Get a Test Export
Archive a Third Party Risk Management Vendor.
Get a Third Party Risk Management Vendor.
List Third Party Risk Management Vendors
Get a Trust Center Request
List Trust Center Requests
Update a Trust Center Request: approve or reject the resources it asks for, set its document security, or send a custom response. Most calls attach no file at all. To attach a signed NDA agreement, the bytes are not sent here. Stage the file first with the `create_file_upload` tool, which hands back a `url` and an `id`; PUT the file's raw bytes to that `url`; then call this tool with that `id` as `upload_id`. The bytes must already be in storage by the time you call this — an `upload_id` whose PUT never happened is refused rather than attached empty. `create_file_upload` documents the size limit and the two expiry windows. Each `upload_id` is redeemable once. Attaching the same file to a second request means staging it again.
Get a User
List Users
Update a User
Get a User Account
Link a User Account
List User Accounts
Attach an evidence file to a User. The bytes are not sent here. Stage the file first with the `create_file_upload` tool, which hands back a `url` and an `id`; PUT the file's raw bytes to that `url`; then call this tool with that `id` as `upload_id`. The bytes must already be in storage by the time you call this — an `upload_id` whose PUT never happened is refused rather than attached empty. `create_file_upload` documents the size limit and the two expiry windows. Each `upload_id` is redeemable once. Attaching the same file to a second User means staging it again.
Get user security settings
Archive a Vendor
Get a Vendor
List Vendors