---
title: MCP tools
description: Tools available through Inth MCP, with arguments and example prompts.
---
Inth MCP provides one tool per REST operation. Tools return the same resource
shapes as the REST API. The client should ask for confirmation before it calls
a tool that changes data; every tool carries annotations that say whether it is
read-only or destructive.

## Organization tools

### `list_organizations`

Lists the Inth organizations that your signed-in account can access, including
your role in each organization. The token must include `organizations.read`.

This tool has no arguments.

Example prompt:

> List my Inth organizations and show my role in each one.

### `get_organization`

Gets one organization. The token must include `organizations.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|Yes|Organization ID|

Every other tool that takes an `organizationId` treats it as optional: without
it the saved active organization of your account is used. If that choice is
unavailable and you belong to multiple organizations, provide the ID explicitly. Tools that take a member,
invitation, project, scan, or item ID find the organization from that ID.

### `create_organization`

Creates an organization owned by your signed-in account and sets up its
billing on the free plan. The token must include `organizations.write`.
Without it the call returns a tool error whose code is `INSUFFICIENT_SCOPE`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`name`|string|Yes|Organization name, 3 to 255 characters|
|`slug`|string|Yes|URL slug, 3 to 20 characters: lowercase letters and numbers, with single hyphens between groups|

Example prompt:

> Create an Inth organization named Acme with the slug `acme`.

You can own up to 50 organizations. A slug that is already taken is refused.

## Member tools

### `list_members`

Lists the members of an organization with their roles. The token must include
`members.read`. Any member can read the roster.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|No|Organization ID; defaults to the active one|

Example prompt:

> Who is in my Acme organization, and what role does each person have?

### `update_member`

Changes a member's role. The token must include `members.write`, and you must
be an admin or owner. Only owners can grant or take the owner role, you cannot
change your own role, and the last owner cannot be demoted.

|Argument|Type|Required|Description|
|--|--|--|--|
|`memberId`|string|Yes|Member ID|
|`role`|`owner`, `admin`, or `member`|Yes|New role|

### `remove_member`

Removes a member from an organization. The token must include `members.write`,
and you must be an admin or owner. Only owners can remove owners, you cannot
remove yourself, and the last owner cannot be removed.

|Argument|Type|Required|Description|
|--|--|--|--|
|`memberId`|string|Yes|Member ID|

### `list_invitations`

Lists pending invitations. The token must include `members.read`, and you must
be an admin or owner.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|No|Organization ID; defaults to the active one|

### `invite_member`

Emails an invitation to join an organization. The invitation expires after 48
hours. The token must include `members.write`, and you must be an admin or
owner; only owners can invite owners. An address that is already a member or
already invited is refused.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|No|Organization ID; defaults to the active one|
|`email`|string|Yes|Address to invite|
|`role`|`owner`, `admin`, or `member`|Yes|Role granted on acceptance|

Example prompt:

> Invite [kim@acme.example](mailto:kim@acme.example) to my Acme organization as an admin.

### `cancel_invitation`

Cancels a pending invitation. The token must include `members.write`, and you
must be an admin or owner.

If acceptance or deletion wins a race with cancellation, the call returns `CONFLICT`. Refresh the member list before trying again.

|Argument|Type|Required|Description|
|--|--|--|--|
|`invitationId`|string|Yes|Invitation ID|

## Project tools

### `list_regions`

Lists the regions available when creating a project. Use the returned region
ID with `create_project`.

This tool has no arguments.

Example prompt:

> Which regions can I use for a new Inth project?

### `list_projects`

Lists projects with their consent settings. You can list every project you can
access or limit the result to one organization. The token must include
`projects.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|No|Only return projects from this organization|

Example prompt:

> List the projects in my Acme organization.

### `get_project`

Gets one project with its consent settings. The token must include
`projects.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`projectId`|string|Yes|Project ID|

### `create_project`

Creates a project and its consent runtime. Admins and owners can use this tool
when the organization has API access and the token includes `projects.write`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|No|Organization; defaults to the active one|
|`name`|string|Yes|Project name|
|`region`|string|Yes|Region ID returned by `list_regions`|
|`consent.trustedOrigins`|string array|No|Origins allowed to use the consent runtime|
|`consent.branding`|`inth`, `c15t`, or `none`|No|Branding shown on the consent banner|

Example prompt:

> Create an Inth project named Docs in the Frankfurt region for the Acme
> organization. Trust `https://docs.example.com` and show Inth branding.

Check the organization, region, project name, and trusted origins before you
approve the call. To find the required IDs first, ask the client to run
`list_organizations` and `list_regions`.

### `update_project`

Renames a project, changes its description, or changes its consent settings.
Arguments left out are unchanged. Renaming a project also changes its slug and
dashboard URL. The token must include `projects.write`, and you must be an
admin or owner. Removing branding needs a plan that includes it.

|Argument|Type|Required|Description|
|--|--|--|--|
|`projectId`|string|Yes|Project ID|
|`name`|string|No|New project name|
|`description`|string or null|No|New description, or null to clear it|
|`consent.trustedOrigins`|string array|No|Origins allowed to use the consent runtime|
|`consent.branding`|`inth`, `c15t`, or `none`|No|Branding shown on the consent banner|

Example prompt:

> Add `https://staging.example.com` to the trusted origins of the Docs project.

### `delete_project`

Archives a project and its consent runtime. The token must include
`projects.write`, and you must be an admin or owner. Confirm before approving.

|Argument|Type|Required|Description|
|--|--|--|--|
|`projectId`|string|Yes|Project ID|

## API key tools

### `list_api_keys`

Lists the organization API keys. Secrets are never returned. The token must
include `api-keys.read`, and you must be an admin or owner.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|No|Organization ID; defaults to your active organization|

### `create_api_key`

Creates an organization API key with the rate limit of the current plan. The
secret is returned once. The token must include `api-keys.write`, and you must
be an admin or owner.

|Argument|Type|Required|Description|
|--|--|--|--|
|`name`|string|Yes|Key name, shown in the key list|
|`organizationId`|string|No|Organization ID; defaults to your active organization|

Example prompt:

> Create an API key named "CI deploy" for my Acme organization.

### `roll_api_key`

Replaces the secret of a key. The old secret stops working immediately and the
new one is returned once. The token must include `api-keys.write`, and you
must be an admin or owner.

|Argument|Type|Required|Description|
|--|--|--|--|
|`keyId`|string|Yes|API key ID|
|`organizationId`|string|No|Organization ID; defaults to your active organization|

### `delete_api_key`

Revokes a key. The token must include `api-keys.write`, and you must be an
admin or owner.

|Argument|Type|Required|Description|
|--|--|--|--|
|`keyId`|string|Yes|API key ID|
|`organizationId`|string|No|Organization ID; defaults to your active organization|

## Code Audit tools

List tools take an optional `organizationId`; without it the active
organization of your account is used. Tools that take a scan, repository, or
item ID find the organization from that ID.

### `list_code_audit_repositories`

Lists the GitHub repositories the Inth App can reach, with the projects each is
linked to, ordered by repository ID. The token must include `code-audit.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|No|Defaults to the active organization|
|`limit`|number|No|Page size, 1 to 100; defaults to 50|
|`cursor`|string|No|`nextCursor` from the previous page|

Returns `items`, `nextCursor`, and `hasMore`. Each request reads only the requested
repository page and its project links.

### `list_code_audit_scans`

Lists scans, newest first, with status, finding counts, and whether the report
is a free preview, locked, or fully unlocked. The token must include
`code-audit.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`repositoryId`|string|No|Only scans of this repository|
|`limit`|number|No|Page size, 1 to 100; defaults to 50|
|`cursor`|string|No|Cursor from the previous page of these filters|
|`status`|string|No|Only scans in this status|

Returns `items`, `nextCursor`, and `hasMore`. Pass `nextCursor` as `cursor`
to read older scans.

### `get_code_audit_scan`

Gets one scan with its progress. The token must include `code-audit.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`scanId`|string|Yes|Scan ID|

### `start_code_audit_scan`

Starts a scan of the production branch of a connected repository. The first
scan of a repository is a free preview; the previous preview must be unlocked
before another scan starts. The token must include `code-audit.write`, and you
must be an admin or owner. Confirm before approving: a scan spends credits when
its report is unlocked.

|Argument|Type|Required|Description|
|--|--|--|--|
|`repositoryId`|string|Yes|Repository ID from `list_code_audit_repositories`|

Example prompt:

> Scan the acme/website repository with Inth Code Audit and tell me what it
> found.

### `get_code_audit_scan_request`

When `start_code_audit_scan` returns `status: "starting"`, poll this tool with
its `preparationId` and `repositoryId` until it returns the scan. Requires
`code-audit.read` or `code-audit.write`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`preparationId`|string|Yes|Preparation ID from the start result|
|`repositoryId`|string|Yes|Repository ID from the start result|

### `get_code_audit_scan_issues`

Reads the findings of a scan. A free preview returns the visible findings plus
`lockedCount` and `unlockCredits`. The token must include `code-audit.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`scanId`|string|Yes|Scan ID|

### `unlock_code_audit_scan`

Spends credits to unlock the full report of a free preview. The token must
include `code-audit.write`, and you must be an owner. Confirm the credit cost
before approving; the call fails with `INSUFFICIENT_CREDITS` when the balance
is too low.

|Argument|Type|Required|Description|
|--|--|--|--|
|`scanId`|string|Yes|Scan ID|

## Inbox tools

### `list_inbox_items`

Lists findings in the Inbox, most recently updated first. The token must
include `inbox.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|No|Organization ID; defaults to the active organization|
|`status`|`open`, `accepted`, `dismissed`, or `resolved`|No|Only items in this status|
|`limit`|number|No|Page size, 1 to 100|
|`cursor`|string|No|Cursor from a previous page|

Example prompt:

> What open P0 and P1 findings are in my Acme Inbox?

### `get_inbox_item`

Gets one finding with its code evidence. The token must include `inbox.read`.

A runtime finding, raised when a scan sees a vendor on your site, also has
`runtimeVendor`. It holds the project ID, the vendor ID, the hosts its evidence
names, and evidence of how the vendor loaded: the page, the script URL, and the
Google Tag Manager container when Tag Manager loaded it. The hosts include
cookie domains, so a host on the list was not always contacted. Other findings
have `runtimeVendor: null`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`itemId`|string|Yes|Inbox item ID|

### `update_inbox_item`

Sets the status of a finding. Pass the `version` from the item as last read;
a stale version is refused so two people cannot overwrite each other. The token
must include `inbox.write`, and you must be an admin or owner.

|Argument|Type|Required|Description|
|--|--|--|--|
|`itemId`|string|Yes|Inbox item ID|
|`status`|`open`, `accepted`, `dismissed`, or `resolved`|Yes|New status|
|`version`|string|Yes|The item's `version` as read|

Example prompt:

> I fixed the logging finding in the checkout handler. Mark it resolved.

### `create_inbox_github_issue`

Opens a GitHub issue in the connected repository for a code finding. Returns
the existing issue if one was already created. The token must include
`inbox.write`, and you must be an admin or owner.

|Argument|Type|Required|Description|
|--|--|--|--|
|`itemId`|string|Yes|Inbox item ID|

## Vendor tools

### `list_project_vendors`

Lists the vendors seen on a project, most recently seen first, with each
vendor's consent category, state, and review state. A vendor in state `active`
has no decision yet. The token must include `projects.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`projectId`|string|Yes|Project ID|
|`state`|`active`, `not_seen_recently`, `ignored`, `approved`, or `blocked`|No|Only vendors in this state|
|`limit`|number|No|Page size, 1 to 100|
|`cursor`|string|No|Cursor from a previous page|

Example prompt:

> Which vendors on the marketing site still need a decision?

### `get_project_vendor`

Gets one vendor seen on a project: the hosts its evidence names, and where and
how the scan saw it load, including the script URL and the Google Tag Manager
container when Tag Manager loaded it. `inboxItemId` is the vendor's runtime
finding in the Inbox, in any status, or null. The token must include
`projects.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`projectId`|string|Yes|Project ID|
|`vendorId`|string|Yes|Vendor ID from `list_project_vendors`|

### `decide_project_vendor`

Approves or ignores a vendor seen on a project. Approving accepts the data
sharing. Either decision closes the vendor's runtime finding in the Inbox, and
later scans keep the decision. Take `projectId` and `vendorId` from
`list_project_vendors` or from `runtimeVendor` on `get_inbox_item`. The token
must include `vendors.write`, and you must be an admin or owner.

|Argument|Type|Required|Description|
|--|--|--|--|
|`projectId`|string|Yes|Project ID|
|`vendorId`|string|Yes|Vendor ID|
|`decision`|`approve` or `ignore`|Yes|`approve` accepts the data sharing|

Example prompt:

> The Hotjar finding on the marketing site is expected. Approve it.

## Billing tools

### `get_billing`

Reads the plan, tier, credit balance, and automatic top-up settings of an
organization. Read only; purchases stay in the dashboard. The token must
include `billing.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|No|Organization ID; defaults to the active organization|

Example prompt:

> How many Inth credits does Acme have left, and is auto top-up on?

An uncertain issue creation or failed persistence retains a reservation, so retries return `CONFLICT` until the result is reconciled. Repository and installation-token checks run before reservation, so preparation failures remain retryable. Refresh the item and contact support if the issue link does not appear.

## Agent tools

The Inth Agent answers consent, privacy, legal research, and c15t questions.
A chat is private to you. A reply can take minutes, so starting a chat or
sending a message returns once the agent has accepted it, with `status`
`running`. Call `get_agent_chat` until `status` is `idle` to read the reply, or
open `dashboardUrl` to watch it in the Dashboard. Replies use your
organization's credits; without enough, the send is refused with
`INSUFFICIENT_CREDITS`. A token without `agents.read` gets `messages` and `title` empty.
Reusing a `clientMessageId` with different text or another Inbox item returns
`CONFLICT`, and so
does reusing one whose turn stopped before the agent started it.
Organization API keys cannot use these tools.

### `start_agent_chat`

Starts a chat with a first message. If the response is lost, call it again
with the same `clientMessageId`: you get the chat the first call started, and
the agent does not answer twice. After an error, use a new ID. The token must
include `agents.write`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`organizationId`|string|No|Organization ID; defaults to the active organization|
|`message`|string|Yes|What to ask the agent|
|`inboxItemId`|string|No|Inbox item the chat is about|
|`clientMessageId`|string|No|A UUID v4 you choose; a retry with the same ID returns the first chat|

Example prompt:

> Ask the Inth Agent whether our German site needs consent before it loads
> analytics.

### `get_agent_chat`

Gets a chat with its messages and `status`. A reply with `failed: true` ended
without an answer. So did a turn whose last message is still yours once
`status` is `idle`; send it again. The token must include `agents.read`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`chatId`|string|Yes|Agent chat ID|

### `send_agent_message`

Sends a follow-up message to one of your chats. A chat answers one message at a
time: a send while `status` is `running` returns `CONFLICT`, unless it repeats
the running message's `clientMessageId`. The token must include
`agents.write`.

|Argument|Type|Required|Description|
|--|--|--|--|
|`chatId`|string|Yes|Agent chat ID|
|`message`|string|Yes|The follow-up|
|`clientMessageId`|string|No|A UUID v4 you choose; a retry with the same ID returns the first chat|

Example prompt:

> Ask the agent the same question for France.

## Feedback

### `submit_feedback`

Sends a report to the existing Inth feedback inbox and returns `reference` and
`alreadySubmitted`. Requires the usual MCP OAuth authentication and `mcp:tools`,
with no additional product scope. It does not charge Credits.

Required arguments are `category`, one of `bug`, `friction`, `docs_mismatch`,
`feature_request`, or `performance`; and `message`, a description of the
problem.

Optional arguments are `surface`, one of `api`, `mcp`, `cli`, `docs`, `sdk`,
`dashboard`, or `other`; and `expected`, `actual`, `reproduction`, `requestId`,
`operation`, `clientName`, and `clientVersion`.

Report unexpected failures, misleading tool descriptions, missing capabilities,
or workarounds. Follow the user's permission to send feedback. Include expected
and actual behavior, without credentials, personal data, customer payloads, or
full transcripts. Submit once per distinct issue; do not report every routine
validation error. If reporting fails, continue the original task.

The quota is ten new reports per user per UTC clock hour. Sending the same
report again within the same UTC day returns the existing reference with
`alreadySubmitted: true` and does not use quota. An operator can pause intake
without hiding saved feedback.
