mcp-keelgrc
Officialkeelgrc-mcp
A Model Context Protocol (MCP) server for Keel. Point any MCP client (Claude Desktop, Claude Code, Cursor) at it and drive your compliance program in natural language: "what's my ISO 27001 readiness?", "list controls still in gap", "open a task to rotate our TLS certs."
Docs: https://docs.keelgrc.com/api-mcp/mcp-server/ · Open source: https://keelgrc.com/open-source/
KEEL_API_KEY=your_key npx keelgrc-mcpIt's a thin wrapper over the Keel public API (/api/v1). Every tool maps 1:1 to a
real endpoint and is scoped to your API key's organization. The MCP grants no more
access than the key already has.
Tools
Tool | Maps to | Does |
|
| Confirm the connected workspace (id, name, tier) |
|
| List controls with state + owner (filter with |
|
| ISO 27001 readiness % and requirement counts |
|
| List compliance tasks |
|
| Create a task ( |
|
| List the risk register with inherent and residual scores |
|
| Add a risk ( |
|
| List vendors (filter with |
|
| Add a vendor ( |
|
| List the personnel directory (filter with |
|
| Add or update a person by email (idempotent) |
|
| List policies (filter with |
|
| Create a policy from Markdown |
|
| List collected evidence (filter with |
|
| Attach a URL as evidence, optionally to a control |
|
| List webhook subscriptions |
|
| Subscribe a URL to events |
|
| Remove a subscription |
One deliberate gap. POST /evidence accepts a file upload as multipart/form-data
as well as a link. This server implements the link form only — streaming a file
through a stdio MCP transport is not something the protocol does well, and a tool
that half-worked would be worse than one that says what it covers. Upload files in
the Keel app or against the REST API directly.
Tool descriptions quote API field names exactly (the control status field is called
state, not status) and use enums with the API's own accepted values, because the
description and schema are the only things the model sees before it calls a tool.
Related MCP server: @lex-tools/codebase-context-dumper
Configuration
Two environment variables:
KEEL_API_KEY: required. Create one under Integrations -> API keys in your Keel workspace.KEEL_BASE_URL: optional, defaults tohttps://app.keelgrc.com. Set it for a self-hosted or preview workspace.
Claude Desktop / Claude Code
Add to your MCP config (claude_desktop_config.json, or .mcp.json for Claude Code):
{
"mcpServers": {
"keel": {
"command": "npx",
"args": ["-y", "keelgrc-mcp"],
"env": { "KEEL_API_KEY": "keel_live_..." }
}
}
}Cursor
~/.cursor/mcp.json uses the same mcpServers shape.
Develop
npm ci # installs exactly package-lock.json
npm run build # compile to dist/
npm run smoke # boot the built server and assert it speaks MCP
KEEL_API_KEY=... node dist/index.js # run over stdionpm run smoke needs no API key and makes no network call: it starts dist/index.js,
completes the MCP handshake, and checks the tool list, the advertised version, and that
nothing but protocol frames reach stdout. It runs in CI before every publish.
The server speaks MCP over stdio, so it never writes to stdout except protocol frames; status goes to stderr.
Publishing
This repository is the source of truth for the npm package
keelgrc-mcp. It is published from here via
npm OIDC trusted publishing (.github/workflows/publish.yml): GitHub Actions
authenticates to npm directly, so there is no stored NPM_TOKEN and no 2FA code, and
each release carries build provenance. The first release (0.1.0) was a manual
bootstrap, because trusted publishing can only be enabled for a package that already
exists.
The one-time trusted-publisher setup (npmjs.com -> the package -> Settings -> Trusted Publisher) is documented at the top of the workflow file. To cut a new release:
Bump
versioninpackage.json(npm rejects re-publishing an existing version). The server reports that same version in its MCP handshake — it readspackage.jsonrather than carrying a copy, so the two cannot drift.Commit the regenerated
package-lock.jsonin the same change, ornpm cifails.Actions tab -> "Publish keelgrc-mcp" -> Run workflow, or publish a GitHub Release.
The publish job is deliberately locked down, because it is the one place in Keel that
holds an OIDC token able to publish under Keel's name with a provenance attestation:
npm ci against a committed lockfile, --ignore-scripts so no dependency's install
hook runs beside that token, a pinned npm rather than @latest, and an audit that
fails the job instead of a flag that silences it.
Security notes
The key is sent only to
KEEL_BASE_URLas aBearertoken; nothing is logged.Access is exactly the key's org, enforced by Keel's row-level security, the same as the REST API. Revoke a key under Integrations to cut off the MCP instantly.
License
MIT (c) Keel GRC LLC. See LICENSE.
Available Tools
18 toolskeel_add_evidence_linkA
Attach a URL as evidence, optionally against a control. This tool covers link evidence only — uploading a file is a multipart request the REST API supports but this stdio server does not, so use the Keel app or the REST API directly for file evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | http(s) URL of the evidence (required). | |
| title | No | Defaults to the URL hostname. | |
| controlId | No | Control id to attach the evidence to. | |
| controlKey | No | Control key to attach to, resolved server-side. Alternative to controlId. | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description correctly carries the behavioral disclosure burden. It reveals a meaningful limitation: multipart file upload is unsupported by this stdio server and routes the user elsewhere. It could additionally state what the tool returns or what happens on duplicate links, but the disclosed constraint is valuable and accurate.
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 compact sentences: the first states the core action, the second adds the critical limitation and alternative. Every sentence earns its place and the key scope constraint 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 simple link-attachment tool, the description covers what the tool does, its scope, and its main exclusion. The parameter schema covers the remaining invocation details. It does not describe response/return behavior, but no output schema exists and the action is simple enough that this is not a significant 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?
The input schema already documents all four parameters with clear descriptions, so the schema-description coverage is high. The tool description adds only that a control target is optional, which is already visible in the schema. It does not clarify the difference between controlId and controlKey, but the schema descriptions handle that adequately.
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 ('Attach a URL as evidence') and immediately scopes itself to link-only evidence, distinguishing it from general evidence creation or file upload tools. It also names the optional control target. This is clearly differentiated from sibling evidence/control 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?
The description explicitly states when to use this tool (link evidence only) and when not to use it (file evidence), and names the alternatives: the Keel app or the REST API. That is an explicit when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_create_policyA
Create a policy from Markdown. Returns the new policy id, key and title. The key is derived from the title when not supplied; a policy is identified by its key, so reusing a key targets the existing policy.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Stable slug, max 60 chars. Derived from the title when omitted. | |
| title | Yes | Policy title (required). | |
| fields | No | Template variables to substitute. Up to 100 keys, values up to 5000 chars. | |
| markdown | No | Policy body as Markdown, up to 200 KB. | |
| description | No | Used as the body when markdown is omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses what the tool returns (id, key, title), explains the key derivation rule, and reveals the important idempotent/upsert-like behavior that reusing a key targets an existing policy. It could go further by clarifying whether updating replaces or merges the existing policy, but it provides meaningful behavior beyond the schema.
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 filler. The primary action is front-loaded, and the second sentence delivers the most important caveat about key reuse. 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?
Given there is no output schema and no annotations, the description compensates by stating the return fields and the key identity rule. The input schema fully documents all parameters, including the markdown/description fallback and fields limits. It is not exhaustive about permissions or exact update semantics, but it is sufficient for an agent to invoke the tool correctly in most cases.
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. The description adds genuine value by clarifying the key parameter: it is derived from the title when omitted, and because policies are identified by key, reusing one targets the existing policy. This is substantive semantic information not present in the schema alone.
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, 'Create a policy from Markdown', and clearly separates this from the read-only list_policies and other create_* siblings by naming the policy resource. It also adds the key-reuse behavior that makes the operation more than a plain 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?
The description implies when to use the tool: when a policy should be created from Markdown. However, it does not explicitly name alternatives or state when not to use it, such as when merely listing or deleting policies. The sibling tools are all distinct resources, so the usage context is inferable but not explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_create_riskA
Add a risk to the workspace risk register. Returns the new risk id. Likelihood and impact are on a 1-5 scale.
| Name | Required | Description | Default |
|---|---|---|---|
| owner | No | Owner name. | |
| title | Yes | Short risk title (required). | |
| impact | Yes | Inherent impact, 1-5 (required). | |
| status | No | Defaults to open. | |
| category | No | Free-text category, e.g. "Access control". | |
| treatment | Yes | How the risk is being treated (required). | |
| likelihood | Yes | Inherent likelihood, 1-5 (required). | |
| ownerEmail | No | Owner email address. | |
| description | No | ||
| residualImpact | No | Post-treatment impact, 1-5. | |
| residualLikelihood | No | Post-treatment likelihood, 1-5. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must cover behavior itself. It usefully discloses the return value (new risk id) and the 1-5 scale for likelihood/impact. However, it does not mention validation, defaulting behavior, permission requirements, or what happens on invalid input, so behavioral transparency is adequate but not rich.
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, front-loaded with the primary action and resource, followed by the most decision-relevant details (return value and scale). No filler or repetition of schema content.
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 straightforward create tool with a rich input schema, the description covers the core outcome (risk created, id returned) and the key value constraint. It is slightly thin on preconditions and error behavior, but it is complete enough for an agent to invoke the tool correctly given the detailed schema.
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 91%, so the schema already documents nearly all parameters. The description adds the 1-5 scale context, but that is already present in the schema descriptions for likelihood and impact. It does not add significant semantic value 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?
The description uses a specific verb ('Add') with a specific resource ('risk to the workspace risk register') and explicitly notes the return value. This clearly distinguishes it from sibling creation tools like keel_create_task and keel_create_policy without needing to inspect 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?
The description makes it clear this tool is for creating risks in the risk register, which is sufficient context for selecting it over sibling create tools. It does not explicitly state when not to use it or name alternatives, but the resource-based framing provides clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_create_taskA
Create a compliance task in the workspace. Returns the new task id. Note: an unparseable dueAt is silently ignored by the API and the task is created without a due date, so send a valid ISO-8601 value or omit it.
| Name | Required | Description | Default |
|---|---|---|---|
| dueAt | No | Optional due date as an ISO-8601 date-time (e.g. 2026-09-01T00:00:00Z). | |
| title | Yes | Short task title (required). | |
| description | No | Optional longer description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description correctly carries the behavioral burgen. It reveals the critical edge case that an unparseable dueAt is silently ignored, and tells the agent to send valid ISO-8601 or omit it. It also clarifies the return value. It does not describe error responses or authorization, but this is sufficient for a simple create operation.
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 long with no filler. The action is front-loaded, the return value is stated, and the important edge case is appended compactly. Every sentence 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 simple create tool with three flat parameters and no output schema, this description is nearly complete. It covers the operation, the return contract, and the one non-obvious behavioral trap. It does not discuss authentication or error stauses, but those are rarely essential for a straightforward create call.
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%, so the schema already documents all three parameters. The description adds meaningful behavior beyond the schema by warning about the silent handling of invalid dueAt values. This extra guidance goes beyond the baseline for a fully documented 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?
The description clearly states the verb and resource: 'Create a compliance task in the workspace.' It also specifies the return value, 'Returns the new task id,' which removes ambiguity. The resource is distinct from sibling tools like keel_create_risk or keell_create_vendor, so an agent can tell it apart.
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 usage is implied by the name and description: use it to create a compliance task rather than list tasks or create other entities. It does not explicitly state when to prefer it over alternatives, nor list excluded cases. This is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_create_vendorB
Add a vendor to the workspace vendor register. Returns the new vendor id and tier.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Vendor name (required). | |
| tier | No | Criticality tier. Defaults to medium. | |
| notes | No | ||
| status | No | ||
| website | No | ||
| dataAccess | No | What customer or company data this vendor can reach. | |
| contactEmail | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does reveal the core side effect: creating a vendor in the register, and it usefully specifies the return contract (new vendor id and tier). However, it does not disclose whether duplicate names are rejected, whether authorization is required, whether the operation is idempotent, or what happens on validation failure.
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 no filler or redundant phrasing. Every sentence earns its place: the action and scope are stated first, and the return value is captured in the second sentence. It is appropriately sized for a simple create operation.
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 tool has 7 parameters, no output schema, and no annotations, yet the description only covers the action and a partial return value. It does not explain how the optional fields interact, what defaults apply beyond tier, or how errors are surfaced. An agent could make a minimal call with 'name', but would be under-informed for richer vendor creation scenarios.
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 only 43%, so the description needed to compensate for the many undocumented fields (notes, status, website, contactEmail, etc.), but it does not mention any input parameters at all. The schema already describes name, tier, and dataAccess, but the remaining parameters are left unexplained by both the schema and the description. With low schema coverage and no compensation, this dimension is weak.
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 ('Add'), a resource ('vendor'), and a scope ('workspace vendor register'), making the tool's purpose unmistakable. It also calls out that the tool returns the new vendor id and tier, which is a concrete outcome. This sufficiently distinguishes it from siblings like keel_list_vensors or other create_* 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?
The description implies when to use the tool (when a vendor needs to be added) but offers no explicit guidance regarding prerequisites, alternatives, or exclusion criteria. It does not name any sibling tool or explain when a different tool should be used instead. An agent is left to infer the usage from the verb and resource rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_create_webhookA
Subscribe a target URL to Keel events. Use event "all" to receive every event. The URL must be a public HTTPS endpoint — the API rejects http://, localhost and private network addresses.
| Name | Required | Description | Default |
|---|---|---|---|
| event | No | Event name to subscribe to (e.g. control.status_changed) or "all". | |
| targetUrl | Yes | Public HTTPS URL that will receive event POSTs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose a key behavioral constraint: the API rejects http://, localhost, and private network addresses. But it does not mention idempotency, behavior for duplicate subscriptions, or response/error semantics, leaving several behavioral traits undisclosed.
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 sentences with no filler. The core action is front-loaded, and each subsequent sentence adds a distinct piece of useful information (event option and URL requirement). It is perfectly sized for the tool's simplicity.
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 description adequately covers the key requirements for calling the tool: target URL and event selection. However, it omits what happens when the optional 'event' parameter is not supplied (no default behavior stated), and with no output schema, it doesn't mention what the API returns on success or failure. These gaps make it adequate but not 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 schema descriptions already cover both parameters (100% coverage), so the baseline is 3. The description adds value by specifying the exact rejection behavior for non-public URLs, which goes beyond the schema's 'public HTTPS URL' phrasing, and it reinforces the 'all' event option.
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, 'Subscribe', and names the resource, 'a target URL to Keel events', making the tool's purpose immediately clear. It distinguishes itself from sibling tools like keel_delete_webhook and keel_list_webhooks by focusing on creation/subscription.
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 gives practical usage context: how to receive all events via event 'all' and the mandatory public HTTPS requirement. However, it does not explicitly say when to use this tool versus siblings like keel_list_webhooks or keel_delete_webhook, so the choice is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_delete_webhookA
Delete a webhook subscription by id. Idempotent — deleting an id that does not exist also succeeds, so a success result does not prove a subscription was removed. Call keel_list_webhooks to confirm.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The webhook subscription id to remove. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral transparency burden. It discloses a non-obvious idempotency behavior: deleting a non-existent id still succeeds, so success does not prove removal. This is valuable context beyond what the schema shows, though it does not cover auth or 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 description is two sentences with no wasted words. The core action is front-loaded, and the critical idempotency caveat plus verification step are presented compactly in the second sentence.
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 single-parameter delete operation with no output schema, the description is complete enough. It explains the action, the surprising success semantics, and how to confirm the outcome, covering everything an agent needs to invoke and verify the call.
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 input schema already documents the only parameter, id, as 'The webhook subscription id to remove' with 100% coverage. The description's 'by id' adds little beyond the schema, so baseline 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 uses a specific verb and resource: 'Delete a webhook subscription by id.' It is unambiguous and clearly distinguishes this tool from siblings like keel_create_webhook and keel_list_webhooks.
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 gives actionable guidance by warning that a success result does not confirm deletion and explicitly recommends calling keel_list_webhooks to verify. It does not explicitly list when not to use the tool, but the single-purpose delete operation makes that less critical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_list_controlsA
List the workspace security controls. Each item has "id", "key", "name", "description", "state", "ownerEmail" and "ownerName". Note the status field is named "state", and its values are not_started / in_progress / implemented / gap / not_applicable.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional case-insensitive substring filter over the control key or name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral transparency burden. It does disclose a useful quirk: the status field is named 'state' and lists its allowed values. However, it does not mention read-only expectations, pagination, ordering, or whether the result set is limited in any way.
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 compact and front-loaded with the core purpose. The field enumeration and the state-value caveat are both useful and are stated without wasted words 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?
For a simple list operation with one optional parameter and no output schema, the description covers the returned fields and the important state-value nuance. It lacks only generic list-behavior details such as pagination or explicit read-only confirmation, which are minor given the tool's simplicity.
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 single optional 'query' parameter has 100% schema description coverage, so the schema already explains it as a case-insensitive substring filter. The tool description adds no additional parameter semantics, making the baseline score of 3 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 uses a specific verb, 'List', and names the exact resource, 'workspace security controls'. It distinguishes itself from sibling list tools like keel_list_policies and keel_list_evidence by clarifying which workspace objects it returns. It also enumerates the item fields, leaving no ambiguity about what a control is.
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 guidance is given about when to use this tool versus its siblings, such as keel_list_policies or keel_list_evidence. An agent must infer the intended use from the resource name and description. There are no exclusions, prerequisites, or alternative routing hints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_list_evidenceB
List collected evidence, with "id", "type" (file / link), "title", "description", "filename", "sizeBytes", "contentType", "url", "collectedAt" and "expiresAt".
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Optional ISO-8601 date-time. Returns only evidence collected strictly after it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'List' implies a read operation, but the description does not explicitly state that no data is modified, nor does it disclose pagination, ordering, rate limits, or auth prerequisites. It focuses almost entirely on output fields rather than behaviorial context.
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 sentence that starts with the core purpose ('List collected evidence') and then lists output fields. While the field list is long, it is relevant and compact. It earns its place because no output schema exists to carry that information. Minimal waste, though formatting could be cleaner.
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 list tool with one optional parameter and no output schema, the description provides the return field names, which is helpful. However, it omits any statement about pagination, result size limits, ordering, or the 'since' filtering behavior (which is only in schema). It is adequate but not fully self-contained.
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% for the sole optional 'sinc e' parameter, so the input schema already documents the meaning. The description adds no additional parameter guidance, but it does not need to since the baseline of 3 applies when schema fully covers the parameter 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?
States the specific verb 'List' and resource 'collected evidence' and enumerates the exact fields returned. This clearly distinguishes it from every sibling list/create tool, so an agent can identify it without opening the schema. No ambiguity remains across the keel family.
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 does not explicitly mention alternatives or when-not-to-use exclusions. Usage is implied by the resource name and verb: to get collected evidence, use this tool. No competing list tool targets evidence, so an agent would likely infer correctly, but the description itself offers no explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_list_peopleA
List the workspace personnel directory, with "id", "source", "externalId", "email", "fullName", "jobTitle", "department", "groups", "managerEmail", "status" and "lastSyncedAt".
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional case-insensitive substring filter over full name and email. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the behavioral disclosure burden. It does reveal the output field set, which is useful, and 'List' implies a read-only operation. However, it does not mention authentication needs, pagination, ordering, rate limits, or failure behavior, so behavioral transparency is only partially addressed.
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, dense sentence that front-loads the primary verb and resource, then lists the concrete output fields. Every part of the sentence contributes useful information, with no repetition or 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?
For a simple list tool with one optional parameter and no output schema, listing the returned fields helps compensate for the missing output schema. Still, there is no mention of pagination limits, result ordering, or whether the list represents all personnel or only active ones, leaving minor but real gaps for an agent.
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 description coverage is 100%, so the single optional query parameter is already fully documented as a case-insensitive substring filter over name and email. The tool description adds no additional meaning beyond this, so the baseline score 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?
The description clearly states the tool's action ('List') and resource ('workspace personnel directory'), and enumerates the exact fields returned. This makes its purpose immediately distinguishable from sibling tools such as keel_whoami, keel_list_vendors, and keel_list_webhooks.
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 guidance about when to use this tool versus its alternatives, no mention of prerequisites, and no exclusions. The only clue is the tool's name and the sibling list, which requires the agent to infer the right context on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_list_policiesA
List the workspace policies, with "id", "key", "title", "status", "version", "updatedAt", "approvedAt", "reviewDue" and "ownerMembershipId".
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional case-insensitive substring filter over the policy title. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly states a read-type 'List' behavior and specifies the returned fields, but it does not disclose ordering, pagination, default filters, whether only certain statuses are returned, or any permissions/rate-limit considerations.
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 focused sentence that states the operation, the resource, and the return fields with no unnecessary filler. It is concise and 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 simple one-parameter list tool with no output schema, the description's field enumeration plus the schema's query filter documentation is sufficient for correct invocation. Minor gaps such as pagination or ordering exist, but they are not critical for basic use.
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 single optional query parameter is fully documented in the input schema with 'Optional case-insensitive substring filter over the policy title.' Because schema_description_coverage is 100%, the description does not need to repeat this; the baseline of 3 applies and the description adds no parameter-level value.
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 ('workspace policies') and enumerates the returned fields, making the operation unmistakable. It is clearly distinct from sibling list tools such as keel_list_vendors or keel_list_risks because it names the exact resource.
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 intended usage is implied: use this tool to list workspace policies, and the resource name separates it from sibling list tools. However, there is no explicit guidance on when to choose this over alternatives, no exclusions, and no mention of prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_list_risksA
List the workspace risk register. Each item has "id", "title", "description", "category", "likelihood", "impact", "inherentScore", "treatment", "residualLikelihood", "residualImpact", "residualScore", "status", "owner", "ownerEmail", "level" (low / medium / high), "mitigatingControls" and "implementedControls". Sorted by status first (open before closed), then level, then score — so an open low risk appears above a closed high one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It covers return contents thoroughly and discloses the exact sort order (status first, then level, then score) with an illustrative example. It does not mention pagination, authentication, or error behavior, but for a zero-parameter list tool this is strong transparency.
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 efficiently structured: the core purpose is front-loaded, followed by the complete field list and then the sorting rule. Every sentence contributes useful information and there is no redundant 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?
For a simple list tool with no parameters and no output schema, the description fully compensates by naming all return fields and specifying ordering. An agent has enough context to invoke the tool and interpret the result without further clarification.
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 are no parameter semantics for the description to add. The description instead adds value by explaining the output structure, which is the most relevant semantic information for this call.
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 ('List') and a specific resource ('the workspace risk register'), and enumerates the fields returned, so an agent can distinguish it from sibling list tools such as keel_list_vendors or keel_list_controls. The 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?
The description clearly implies this tool should be used when the agent needs the contents of the risk register. However, it does not explicitly say when to prefer this over sibling list tools or mention any exclusions or preconditions, so usage guidance is reasonable but only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_list_tasksA
List the workspace compliance tasks. Each item has "id", "title", "description", "status" (open / in_progress / done), "dueAt", "createdAt", "relatedEntityType" and the assignee as "assigneeId" / "assigneeName" / "assigneeEmail".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No anotations are provided, so the description carries the burden. It goes beyond a simple statement by listing exact output fields and status enum values. It doesn't discuss pagination or ordering, but for a read-only list with no parameters, this is adequate transparency.
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. It conveys the operation, resource, and output structure without wasted words, making it easy to scan.
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 output schema, the description provides the complete return-value shape, including field names, status values, and assignee fields. For a zero-parameter listing tool, this is sufficient for an agent 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?
The tool has zero parameters, so the baseline is 4. The description need not explain parameter semantics, and the input schema confirms no parameters exist.
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 opens with a specific verb, 'List', and a clear resource, 'workspace compliance tasks'. It enumerates the item's fields, making the tool's purpose unambiguous and distinguishing it from sibling list tools targeting different resources.
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 provides clear context: use this tool to retrieve workspace compliance tasks. It doesn't explicitly mention alternatives, but the list of sibling tools makes the distinction obvious, and there is no competing task-listing tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_list_vendorsA
List the third-party vendors tracked in the workspace, with "id", "name", "website", "contactEmail", "tier", "inherentTier", "residualTier", "status", "dataAccess", "notes", "lastReviewedAt" and "reviewDue".
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional case-insensitive substring filter over the vendor name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosure. It clearly scopes the operation to workspace-tracked vendors and enumerates all returned fields, giving the agent an accurate picture of the output. It does not mention sorting, pagination, or access requirements, but 'List' sufficiently signals a read-only operation.
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 that front-loads the verb and resource, then enumerates the returned fields. The field list is slightly long but directly useful since there is no output schema. No filler or unnecessary wording.
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 list tool with one optional parameter and no output schema, the description is nearly complete: it explains the return values explicitly and the schema handles the parameter. Minor omissions like default ordering or whether all statuses are included keep it from a perfect score.
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 query parameter's description ('Optional case-insensitive substring filter over the vendor name') fully documents its meaning. The tool description adds no extra parameter context, 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 ('List') and resource ('third-party vendors tracked in the workspace'), making the tool's function immediately clear. It also differentiates itself from sibling tools like keel_whoami and keel_readiness, which serve unrelated purposes.
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?
When to use the tool is implied by its clear purpose: if an agent needs the vendor list, this is the tool. However, there is no explicit guidance about when not to use it or why it should be preferred over alternatives, though sibling tools are obviously distinct in function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_list_webhooksA
List the workspace webhook subscriptions, with "id", "targetUrl", "event" and "createdVia". The signing secret is never returned.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It notably states that the signing secret is never returned, which is a key safety/privacy guarantee. It also lists the exact fields returned, giving a clear picture of the tool's behavior. A simple read-only list tool needs no more than this.
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 concise sentences. The first sentence front-loads the action and resource, the second adds a single crucial caveat. Every word earns its place; 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?
For a zero-parameter list operation, the description covers the resource, the key response fields, and an important behavioral guarantee. It does not mention pagination, but that may not apply, and the sibling context clarifies the tool family. Overall it is complete enough for 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?
The tool has zero parameters, so the baseline for this dimension is 4. The description adds no parameter semantics because none are needed; the input schema is empty and fully covered.
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 action ('List') and resource ('workspace webhook subscriptions'), and explicitly enumerates the returned fields. This distinguishes it from sibling tools like keel_create_webhook and keel_delete_webhook, which handle mutation of the same resource.
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 implies when to use the tool: whenever webhook subscriptions need to be listed. However, it does not explicitly mention alternatives or state when not to use it, leaving the routing logic to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_readinessA
Get the audit-readiness summary for ISO/IEC 27001:2022 — this endpoint covers that framework only, not whichever framework the workspace has applied. Returns "framework", "version", "readiness" (percent, integer), "total", "applicable", "covered", "inProgress", "gap", "unaddressed" and "notApplicable".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the exact return fields, including types ('readiness' as percent integer), and the framework scoping constraint. It doesn't state auth, rate limits, or errors, but for a no-parameter read endpoint this is a solid level of disclosure.
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 sentences with no filler: the first states purpose and scope, the second enumerates the response fields. Every part adds value and the most important scoping caveat 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 simple no-parameter read endpoint with no output schema, the description is fully self-sufficient: it identifies the exact framework, clarifies the exclusion, and lists every return field. Nothing an agent needs to decide to call this tool 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 takes zero parameters and the schema is empty, so there are no parameter semantics to explain. The description implicitly confirms this by not mentioning any inputs, and per the baseline for 0-param tools, no additional description is needed.
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 ('Get') and resource ('audit-readiness summary for ISO/IEC 27001:2022'), and explicitly narrows the scope to that framework only, distinguishing it from any workspace-applied framework. The sibling tools are all different resources (whoami, list vendors, controls, etc.), so this description clearly identifies what this tool does.
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 clearly communicates when to use this tool: when you need the readiness summary specifically for ISO/IEC 27001:2022, not the framework the workspace has applied. It doesn't name alternative tools for other frameworks, but the sibling list shows no overlapping readiness tools, so the exclusion is sufficient context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_upsert_personA
Add a person to the workspace directory, or update them if the email already exists. Idempotent: the response includes "created" (true for a new record, false for an update). Only manually-created records are updated — a person synced from an identity provider is returned unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address — the identity key (required). | ||
| groups | No | Group or team names. | |
| status | No | ||
| fullName | No | ||
| jobTitle | No | ||
| department | No | ||
| managerEmail | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does it well. It discloses idempotency, the 'created' response field, and the significant edge case that IdP-synced people are not updated. This goes well beyond a bare verb+resource statement.
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 tight sentences with no filler. The core purpose is front-loaded, and the idempotency and identity-provider behavior are stated 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 7-parameter mutation tool with no annotations and no output schema, the description is largely complete: it covers behavior, idempotency, and a key edge case. It loses a point because several parameters receive no description-level guidance, leaving agents to rely on parameter names and the enum values.
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 only 29%, and the description does not compensate by explaining the five undocumented parameters. Only email identity-key behavior is implied by the prose. The remaining parameters have self-evident names but the description adds no semantic 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?
The description states a specific action ('Add a person to the workspace directory, or update them if the email already exists') tied to a clear resource and an upsert semantic. It is unambiguous and easily distinguished from sibling tools like keel_list_people.
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 makes clear when to use the tool: to add a person or update an existing manually-created person. It also gives an explicit when-not: records synced from an identity provider are returned unchanged. It does not name an alternative tool, but none is obviously needed among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_whoamiA
Verify the API key and return the connected Keel organization as {"org":{"id","name","tier"}}, where "tier" is the plan (free / starter / pro / enterprise / msp). Use this first to confirm which workspace you are acting on.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of conveying behavior. It transparently states the operation (verify API key, return connected organization) and explains the tier field's possible values. It does not discuss error cases like invalid keys, but for a zero-parameter read-only identity tool this is a minor gap.
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 compact single sentence that front-loads the core purpose and immediately states when to use the tool. It includes only necessary information—return shape, tier enum, and usage guidance—with no wasted words.
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 tool with no parameters, no annotations, and no output schema, the description is fully self-contained: it names the operation, gives the exact JSON response shape, enumerates the tier values, and provides clear usage context. An agent has everything needed to call it correctly and interpret the result.
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, so the baseline is 4; there is no parameter meaning the description needs to add. The schema already covers all params vacuously, and the description appropriately skips param documentation in favor of output details.
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 ('Verify') and resource (API key / connected Keel organization), and specifies the exact returned structure including id, name, and tier with plan values. This clearly distinguishes it from sibling tools like keel_list_vendors or keel_create_task.
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 explicitly instructs 'Use this first to confirm which workspace you are acting on,' providing a clear when-to-use directive. Even though no alternatives are named, the identity-check nature of the tool makes this guidance decisive and sufficient.
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. Dates show when Glama detected each change.
18 tool updates
v0.2.0- First observed
keel_add_evidence_link - First observed
keel_create_policy - First observed
keel_create_risk - First observed
keel_create_task - First observed
keel_create_vendor - First observed
keel_create_webhook - First observed
keel_delete_webhook - First observed
keel_list_controls - First observed
keel_list_evidence - First observed
keel_list_people - First observed
keel_list_policies - First observed
keel_list_risks - First observed
keel_list_tasks - First observed
keel_list_vendors - First observed
keel_list_webhooks - First observed
keel_readiness - First observed
keel_upsert_person - First observed
keel_whoami
TDQS
Each tool maps to a distinct resource and action; there is no meaningful overlap between list, create, delete, and upsert operations. The few convenience names like whoami and readiness are also unambiguous.
All tools share the keel_ prefix and mostly follow a verb_noun pattern such as list_risks, create_task, and delete_webhook. keel_whoami and keel_readiness are minor deviations from that pattern.
18 tools is slightly above the typical well-scoped range, but the broad Keel GRC domain of risks, vendors, tasks, policies, evidence, people, and webhooks justifies the count. Each tool appears to serve a purpose with no obvious filler.
The set is read-and-create heavy but lacks update and delete operations for core entities like tasks, risks, vendors, and policies, which are common lifecycle actions in a GRC workflow. Evidence file upload is also unsupported, requiring fallback to external tools.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
EU compliance corpus across 8 frameworks (NIS2, DORA, AI Act, ISO 27001 + more) via MCP.
Cited, standards-aware compliance overlay for AI assistants (ISO, NIST, FedRAMP, IRAP), over MCP.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn educational implementation of a Model Context Protocol server that demonstrates how to build a functional MCP server for integrating with various LLM clients like Claude Desktop.1163MIT
- AlicenseAqualityDmaintenanceA Model Context Protocol (MCP) server designed to easily dump your codebase context into Large Language Models (LLMs).1123Apache 2.0

@konsulto/mcpofficial
AlicenseAqualityBmaintenanceMCP server that enables Claude Code to drive the Konsulto cybersecurity audit platform from the CLI, including reading and writing findings, managing evidence, and handling scope and assets.19171MIT- AlicenseNot gradedqualityAmaintenanceA modular, multi-transport Model Context Protocol server that connects AI assistants to the CrowdStrike Falcon platform. Query NG-SIEM logs, triage alerts, inspect endpoints, manage detection rules, and audit cloud security posture — all through natural language.13MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Keel-GRC/keelgrc-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server