
Every company's public record on the Trooth Network, and Semanto: a company's website, signed.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Runs one read-only tool by its name with its arguments, exactly as calling it directly does: the same sign-in, scopes and limits. Use it for a tool search_tools or enable_toolset named that your client does not list. A tool that changes something runs through call_write_tool.
The tool's name, as search_tools gives it.
The tool's arguments, as its input schema asks.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http trooth https://mcp.trooth.co
Runs one read-only tool by its name with its arguments, exactly as calling it directly does: the same sign-in, scopes and limits. Use it for a tool search_tools or enable_toolset named that your client does not list. A tool that changes something runs through call_write_tool.
| Argument | Type | Description |
|---|---|---|
| name* | string | The tool's name, as search_tools gives it. |
| arguments | object | The tool's arguments, as its input schema asks. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"pattern": "^[a-z0-9_]{1,80}$",
"maxLength": 80,
"minLength": 1,
"description": "The tool's name, as search_tools gives it."
},
"arguments": {
"type": "object",
"description": "The tool's arguments, as its input schema asks."
}
},
"additionalProperties": false
}Runs one tool that changes something (publish, sign, send, revoke and the like) by its name with its arguments, exactly as calling it directly does: the same sign-in, scopes and approvals, and a person's approval where the tool asks for one. Use it for a write tool search_tools or enable_toolset named that your client does not list. A read-only tool runs through call_tool.
| Argument | Type | Description |
|---|---|---|
| name* | string | The write tool's name, as search_tools gives it. |
| arguments | object | The tool's arguments, as its input schema asks. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"pattern": "^[a-z0-9_]{1,80}$",
"maxLength": 80,
"minLength": 1,
"description": "The write tool's name, as search_tools gives it."
},
"arguments": {
"type": "object",
"description": "The tool's arguments, as its input schema asks."
}
},
"additionalProperties": false
}Adds one toolset to what tools/list shows for this sign-in or key: developer (Developer), team (Team and governance), commerce (Commerce), reports (Reports), evidence (Evidence and monitoring), semanto_more (Semanto, every tool). Answers the group's tools. Every tool already answers by name; this only changes the list.
| Argument | Type | Description |
|---|---|---|
| toolset* | string | The toolset to show. |
{
"type": "object",
"required": [
"toolset"
],
"properties": {
"toolset": {
"enum": [
"start",
"public_record",
"trust_profile",
"semanto",
"developer",
"team",
"commerce",
"reports",
"evidence",
"semanto_more"
],
"type": "string",
"description": "The toolset to show."
}
},
"additionalProperties": false
}Searches every tool on this server, shown or not, by name, title and description, and answers the best matches with their toolset and input schema. Each match answers by name.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many matches, 8 by default. |
| query* | string | What the tool does, in a few words. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "How many matches, 8 by default."
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 2,
"description": "What the tool does, in a few words."
}
},
"additionalProperties": false
}Read what one company on the Trooth Network has declared about AI and customer data (whether it trains models on customer data, whether AI is in the product, which approaches), named by its domain or its Trooth slug, matched exactly. Each row is the company's own declaration and is labeled so, with whether Trooth observed a supporting policy clause: not observed means Trooth has not read one, never that the company does not train on customer data. Read only.
| Argument | Type | Description |
|---|---|---|
| company* | string | Company domain (e.g. acme.com) or Trooth slug |
{
"type": "object",
"required": [
"company"
],
"properties": {
"company": {
"type": "string",
"maxLength": 2048,
"description": "Company domain (e.g. acme.com) or Trooth slug"
}
}
}Answer a question about Trooth itself (what the Trooth Network is, what one company record carries, pricing, how witnessing works) from Trooth's fixed, curated knowledge base. Input: one question of at most 300 characters, with no personal details; Trooth keeps no question text. Makes no outside request. A question the knowledge base does not cover returns out_of_scope; for a company's record use trooth_public_trust_profile.
| Argument | Type | Description |
|---|---|---|
| question* | string | A question about Trooth |
{
"type": "object",
"required": [
"question"
],
"properties": {
"question": {
"type": "string",
"maxLength": 300,
"description": "A question about Trooth"
}
}
}List how one company's published record changed: give its domain or slug and, optionally, since (an ISO 8601 date or time). Returns record versions oldest first, each with the fact keys changed, added or removed, per-fact edits (old value, new value, time, role) when the record carries them, with next_cursor for more, and the recalls the company stored or changed in Semanto, oldest first, with recall_cursor to poll for newer ones. Read only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Optional. How many record versions per page, 1 to 200 (default 100). |
| since | string | Optional. Only changes at or after this ISO 8601 date or time, e.g. 2026-10-01 |
| cursor | string | Optional. The next_cursor (also at changes.next_cursor) of the previous answer, sent with the same company and since. |
| company* | string | Company domain (e.g. acme.com) or Trooth slug |
| recall_cursor | string | Optional. The changes.recall_cursor of the previous answer: only recalls recorded after it are returned. |
{
"type": "object",
"required": [
"company"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Optional. How many record versions per page, 1 to 200 (default 100)."
},
"since": {
"type": "string",
"maxLength": 40,
"description": "Optional. Only changes at or after this ISO 8601 date or time, e.g. 2026-10-01"
},
"cursor": {
"type": "string",
"maxLength": 512,
"description": "Optional. The next_cursor (also at changes.next_cursor) of the previous answer, sent with the same company and since."
},
"company": {
"type": "string",
"maxLength": 2048,
"description": "Company domain (e.g. acme.com) or Trooth slug"
},
"recall_cursor": {
"type": "string",
"maxLength": 512,
"description": "Optional. The changes.recall_cursor of the previous answer: only recalls recorded after it are returned."
}
}
}Read one answer from one company's published record: give the company's domain or slug and a buyer question ID (q_ai_training and eleven more, in trooth://buyer-questions) or a fact ID such as security.mfa_methods. Returns the sentence, value, provenance word, date, freshness window and anchor address, or the negative that applies: no, not_published or not_read. A fact ID the record does not hold answers unknown_fact_id with the IDs it holds. Read only.
| Argument | Type | Description |
|---|---|---|
| fact | string | A fact ID, <section>.<field>, e.g. security.mfa_methods. Give this or question. |
| company* | string | Company domain (e.g. acme.com) or Trooth slug |
| question | string | A buyer question ID, e.g. q_ai_training. Give this or fact. |
{
"type": "object",
"required": [
"company"
],
"properties": {
"fact": {
"type": "string",
"maxLength": 200,
"description": "A fact ID, <section>.<field>, e.g. security.mfa_methods. Give this or question."
},
"company": {
"type": "string",
"maxLength": 2048,
"description": "Company domain (e.g. acme.com) or Trooth slug"
},
"question": {
"type": "string",
"maxLength": 40,
"description": "A buyer question ID, e.g. q_ai_training. Give this or fact."
}
}
}For one hub (business_profile or merchant_center): previews what the signed facts change there, then, with approve true, sends those items, then checks the hub against the signed copy. Each call does the next of preview, send and check and answers next_action. Sending waits for a person's approval where the key needs one.
| Argument | Type | Description |
|---|---|---|
| hub* | string | The hub to sync. |
| run_id | string | The send to check, from the previous answer. |
| approve | boolean | true sends the items the preview showed. Leave it out to preview. |
| trooth_id | string | The company's trooth_id. Leave it out to use the one your key or sign-in acts for. |
| idempotency_key | string | A new value for each send; the same value answers the same send. |
{
"type": "object",
"required": [
"hub"
],
"properties": {
"hub": {
"enum": [
"business_profile",
"merchant_center"
],
"type": "string",
"description": "The hub to sync."
},
"run_id": {
"type": "string",
"maxLength": 80,
"description": "The send to check, from the previous answer."
},
"approve": {
"type": "boolean",
"description": "true sends the items the preview showed. Leave it out to preview."
},
"trooth_id": {
"type": "string",
"maxLength": 80,
"description": "The company's trooth_id. Leave it out to use the one your key or sign-in acts for."
},
"idempotency_key": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "A new value for each send; the same value answers the same send."
}
},
"additionalProperties": false
}List the companies published on the Trooth Network by what they published: industry, data region, witnessed or not, and claimed (the company published its own profile) or unclaimed. Returns 20 entries per page in alphabetical order of record identifier with next_cursor (limit takes 1 to 200), from the first 100 matches the directory returns, so at most 100 come back; nothing is weighed or put in an order of merit. Read only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Optional. How many entries per page, 1 to 200 (default 20). |
| cursor | string | Optional. The next_cursor (also at page.next_cursor) of the previous answer, sent with the same filters. |
| claimed | boolean | Optional. true for companies that published their own profile, false for listed domains with none |
| industry | string | Optional. Only companies in this industry, e.g. Fintech |
| witnessed | boolean | Optional. true for companies Trooth witnessed, false for those it has not |
| data_region | string | Optional. Only companies that publish this data residency region, e.g. EU |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Optional. How many entries per page, 1 to 200 (default 20)."
},
"cursor": {
"type": "string",
"maxLength": 512,
"description": "Optional. The next_cursor (also at page.next_cursor) of the previous answer, sent with the same filters."
},
"claimed": {
"type": "boolean",
"description": "Optional. true for companies that published their own profile, false for listed domains with none"
},
"industry": {
"type": "string",
"maxLength": 100,
"description": "Optional. Only companies in this industry, e.g. Fintech"
},
"witnessed": {
"type": "boolean",
"description": "Optional. true for companies Trooth witnessed, false for those it has not"
},
"data_region": {
"type": "string",
"maxLength": 100,
"description": "Optional. Only companies that publish this data residency region, e.g. EU"
}
}
}Needs an OAuth access token for this server, for a person who has signed in to trooth.co (no scope is required; the public tools here need no token, and an agent key is not accepted), and takes no arguments: the workspace comes from the token's subject and never from an argument. Reads the company record of the Trooth workspace the signed-in person belongs to and returns its name, its slug and the address of its public page. Read only.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Fetch https://<domain>/ and /.well-known/security.txt once, when called, from Trooth's server and report whether HTTPS answered, which of five response headers (HSTS, CSP, nosniff, frame protection, referrer policy) are present, and whether security.txt is published, absent or unread. IP literals and names resolving to private, loopback or link-local addresses are refused; redirects are reported, not followed; each request stops after 4 seconds. Observations, not witnessed evidence, not a grade.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Domain to read, e.g. example.com |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"maxLength": 2048,
"description": "Domain to read, e.g. example.com"
}
}
}Uses a trooth.co sign-in (or an agent key with profile:read). Takes only workspace, when the person belongs to several. Lists the steps left before the workspace's Trust Profile can be published, each with state done, todo or unknown and how to do it. A step that is the owner's own choice carries action_url, the trooth.co page where the owner takes it. Read only.
| Argument | Type | Description |
|---|---|---|
| workspace | string | With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one. |
{
"type": "object",
"properties": {
"workspace": {
"type": "string",
"pattern": "^cid_[0-9a-f]{32}$",
"maxLength": 36,
"description": "With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one."
}
},
"additionalProperties": false
}Uses a trooth.co sign-in (or an agent key with profile:read). Takes only workspace, when the person belongs to several. Lists, field by field, where the saved Trust Profile draft and what the public page says now differ: each such field, by JSON Pointer, with change added, removed or changed and both values. A profile never published shows every field as added. Read only.
| Argument | Type | Description |
|---|---|---|
| workspace | string | With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one. |
{
"type": "object",
"properties": {
"workspace": {
"type": "string",
"pattern": "^cid_[0-9a-f]{32}$",
"maxLength": 36,
"description": "With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one."
}
},
"additionalProperties": false
}Checks DNS now for the TXT record trooth_profile_domain_start gave. Uses the person's sign-in as owner or admin (or an agent key with profile:publish). Takes domain, and workspace when the person belongs to several. Returns confirmed true, or confirmed false with found (the TXT values at the record's name), expected (the value it needs), host and dns_host (where the domain's DNS is managed), and the fix; DNS can take minutes. Once confirmed, trooth_profile_publish can put the page live.
| Argument | Type | Description |
|---|---|---|
| domain* | string | The bare domain, as started. |
| workspace | string | With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one. |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"maxLength": 253,
"minLength": 3,
"description": "The bare domain, as started."
},
"workspace": {
"type": "string",
"pattern": "^cid_[0-9a-f]{32}$",
"maxLength": 36,
"description": "With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one."
}
},
"additionalProperties": false
}Starts the proof that the workspace controls its company's domain. Uses the person's sign-in as owner or admin (or an agent key with profile:publish). Takes domain, and workspace when the person belongs to several; it states the caller acts for someone authorized to represent the company. Returns the DNS TXT record (host, value) to add with the DNS host's own API. trooth_profile_domain_check confirms it. Refusals carry code and fix.
| Argument | Type | Description |
|---|---|---|
| domain* | string | The bare domain, for example example.com. |
| workspace | string | With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one. |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"maxLength": 253,
"minLength": 3,
"description": "The bare domain, for example example.com."
},
"workspace": {
"type": "string",
"pattern": "^cid_[0-9a-f]{32}$",
"maxLength": 36,
"description": "With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one."
}
},
"additionalProperties": false
}Uses a trooth.co sign-in (or, for an agent that runs on its own, the workspace's agent key with profile:read). Takes fields, and workspace when the person belongs to several. Returns the workspace's own Trust Profile DRAFT as saved now, its revision (send it as if_match to trooth_profile_update), whether it is published, and its public address. fields narrows the draft to the keys or JSON Pointers asked for. With no sign-in: status unauthenticated and the fix. Read only.
| Argument | Type | Description |
|---|---|---|
| fields | array | Optional. Only these parts of the profile come back: top-level keys (tagline, security) or JSON Pointers (/security/contact, /founders/0). Leave it out for the whole draft. revision, published and artwork for the parts asked for are always there. |
| workspace | string | With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one. |
{
"type": "object",
"properties": {
"fields": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]+$",
"maxLength": 300,
"minLength": 1
},
"maxItems": 50,
"description": "Optional. Only these parts of the profile come back: top-level keys (tagline, security) or JSON Pointers (/security/contact, /founders/0). Leave it out for the whole draft. revision, published and artwork for the parts asked for are always there."
},
"workspace": {
"type": "string",
"pattern": "^cid_[0-9a-f]{32}$",
"maxLength": 36,
"description": "With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one."
}
},
"additionalProperties": false
}Uses a trooth.co sign-in (or an agent key with profile:write). Reads one https page of the company's own website (robots.txt first) and returns the candidates, saving nothing; accept all or candidate ids saves them to the DRAFT with the page named. pages (up to ten of one site) reads each in turn and fills blank draft fields only, the website from the home page, each value with its page. Nothing is published. It states the caller may draft from those pages.
| Argument | Type | Description |
|---|---|---|
| url | string | One https page, for example https://yourcompany.com/security. Send url or pages. |
| pages | array | Up to ten https pages of one site, for example the home, about, security, trust, privacy and contact pages. Read in turn and saved to the draft, blanks only. |
| accept | any | Optional. "all", or a list of candidate ids from a first call, to save to the draft. Leave it out to read only. |
| workspace | string | With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2000,
"minLength": 12,
"description": "One https page, for example https://yourcompany.com/security. Send url or pages."
},
"pages": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000,
"minLength": 12
},
"maxItems": 10,
"minItems": 1,
"description": "Up to ten https pages of one site, for example the home, about, security, trust, privacy and contact pages. Read in turn and saved to the draft, blanks only."
},
"accept": {
"anyOf": [
{
"enum": [
"all"
],
"type": "string"
},
{
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 200
}
],
"description": "Optional. \"all\", or a list of candidate ids from a first call, to save to the draft. Leave it out to read only."
},
"workspace": {
"type": "string",
"pattern": "^cid_[0-9a-f]{32}$",
"maxLength": 36,
"description": "With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one."
}
},
"additionalProperties": false
}Puts the workspace's saved Trust Profile draft on its public page, which anyone can read. Uses a trooth.co sign-in if the person's role may publish the page (or an agent key with profile:publish). Takes only workspace, when the person belongs to several. Success: status published with public_url. A first publish needs the domain proved: code domain_proof_required until trooth_profile_domain_start and trooth_profile_domain_check are done. Other refusals carry their code and fix.
| Argument | Type | Description |
|---|---|---|
| workspace | string | With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one. |
{
"type": "object",
"properties": {
"workspace": {
"type": "string",
"pattern": "^cid_[0-9a-f]{32}$",
"maxLength": 36,
"description": "With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one."
}
},
"additionalProperties": false
}Uses a trooth.co sign-in (or an agent key with profile:read). Takes only workspace, when the person belongs to several. Turns each open checklist item into a step: the problem, the fix, the change or call that closes it, and the source its value needs. It proposes and never applies: every proposed value is null until the caller reads it from that source and send it with trooth_profile_update. Read only.
| Argument | Type | Description |
|---|---|---|
| workspace | string | With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one. |
{
"type": "object",
"properties": {
"workspace": {
"type": "string",
"pattern": "^cid_[0-9a-f]{32}$",
"maxLength": 36,
"description": "With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one."
}
},
"additionalProperties": false
}Changes fields of the workspace's own Trust Profile DRAFT; the public page changes only on trooth_profile_publish. Uses a trooth.co sign-in if the person's role may edit the page (or an agent key with profile:write). Each change names one field by JSON Pointer (/tagline, /founders/-) with a value and its source { url, quote } from the company's own page, or state not_published with a reason. Returns each change as applied or rejected (with code and fix) and the new revision.
| Argument | Type | Description |
|---|---|---|
| fields | array | Optional, with dry_run. Only these parts of the draft the dry run would keep come back: top-level keys or JSON Pointers. Leave it out for the whole draft. |
| changes* | array | The changes, applied in order; a rejected change leaves the draft as it was and the ones after it still apply. Fields and their types: https://trooth.co/api/v1/profile/schema. Fields a person keeps (the page address, the theme, review marks) are rejected with code human_only. |
| dry_run | boolean | Optional. true checks every change and returns what would be kept, and saves nothing. |
| if_match | string | Optional. The revision the caller read with trooth_profile_get. When someone changed the draft since, nothing is saved and the answer is code revision_changed with the new revision. |
| workspace | string | With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one. |
Uses a trooth.co sign-in (or an agent key with profile:read). Takes changes (optional, as trooth_profile_update takes them), expected_revision and workspace. Runs the checks of trooth_profile_update with dry_run and of a publish (name, domain proof, transcripts, agent publishing permission, instructions to a model) and saves nothing. Returns each check with its code and fix, and would_publish. Read only.
| Argument | Type | Description |
|---|---|---|
| changes | array | Optional. The changes to check, as trooth_profile_update takes them. Leave it out to check the draft as it is saved now. |
| workspace | string | With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one. |
| expected_revision | string | Optional. The revision the caller read with trooth_profile_get. When the draft changed since, the answer is code revision_changed with the new revision. |
{
"type": "object",
"properties": {
"changes": {
"type": "array",
"items": {
"type": "object",
"required": [
"path"
],
"properties": {
"op": {
"enum": [
"set",
"remove",
"append"
],
"type": "string",
"description": "Optional. set (the default), remove, or append to a list."
},
"path": {
"type": "string",
"maxLength": 300,
"description": "The field, as an RFC 6901 JSON Pointer: /tagline, /security/contact, /founders/0/name, or /founders/- to add to the end of a list."
},
"state": {
"enum": [
"not_published",
"not_applicable"
],
"type": "string",
"description": "Instead of a value: the company does not publish this (not_published) or it does not apply (not_applicable). Clears the field. Needs a reason."
},
"value": {
"description": "The new value, of the field's type. Required unless state is given or op is remove. A picture (/logoUrl, /coverUrl, /founders/0/photoUrl) is a direct https link or the image file itself as a base64 data: URL (data:image/png;base64,..., PNG, JPEG or WebP, at most 140,000 bytes); trooth.co re-encodes and stores its own copy."
},
"reason": {
"type": "string",
"maxLength": 500,
"description": "With state: one sentence on what the caller checked, for example: The security page does not mention penetration testing."
},
"source": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2000,
"description": "The https address of the company's own page the value was read from."
},
"quote": {
"type": "string",
"maxLength": 2000,
"description": "The words on that page, or what the person said."
},
"person": {
"type": "boolean",
"description": "true: the company states this value itself, for example its phone number, and no page carries it. Kept as stated by the signed-in person, or by the agent key and its maker."
},
"retrieved_at": {
"type": "string",
"maxLength": 40,
"description": "When the caller read the page (RFC 3339), optional."
}
},
"description": "Where the value came from. Required for every non-empty value: the https page it was read from, or person: true for the company's own statement no page carries, such as its phone number (kept as stated by the signed-in person, or by the agent key and the person who made it). Without either, the change is rejected with code source_required."
}
},
"additionalProperties": false
},
"maxItems": 200,
"minItems": 1,
"description": "Optional. The changes to check, as trooth_profile_update takes them. Leave it out to check the draft as it is saved now."
},
"workspace": {
"type": "string",
"pattern": "^cid_[0-9a-f]{32}$",
"maxLength": 36,
"description": "With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one."
},
"expected_revision": {
"type": "string",
"maxLength": 100,
"description": "Optional. The revision the caller read with trooth_profile_get. When the draft changed since, the answer is code revision_changed with the new revision."
}
},
"additionalProperties": false
}Read one company's published record on the Trooth Network, given its domain or Trooth slug, matched exactly, never by a similar name; a name several companies share returns their candidates, not a pick. Returns a status and a provenance label with the complete Trust Profile (detail full, the default) or a short answer (detail summary, the better first call). A record is keyed by its domain and does not by itself say which legal entity, subsidiary or product the domain belongs to. Read only.
| Argument | Type | Description |
|---|---|---|
| detail | string | full (default): the complete profile, section by section. summary: the short answer, the contract summary members and where the record is; ask for it first. |
| company* | string | Company domain (e.g. acme.com) or Trooth slug; a URL is reduced to its host |
| sections | string | Optional. Comma-separated section names to return, from: overview, identity, history, funding, product, pricing, stack, security, privacy, ai, hosting, infrastructure, procurement, relationships, proof, people, documents, evidence, cards, faq. Omit for every section. |
{
"type": "object",
"required": [
"company"
],
"properties": {
"detail": {
"enum": [
"full",
"summary"
],
"type": "string",
"maxLength": 7,
"description": "full (default): the complete profile, section by section. summary: the short answer, the contract summary members and where the record is; ask for it first."
},
"company": {
"type": "string",
"maxLength": 2048,
"description": "Company domain (e.g. acme.com) or Trooth slug; a URL is reduced to its host"
},
"sections": {
"type": "string",
"maxLength": 400,
"description": "Optional. Comma-separated section names to return, from: overview, identity, history, funding, product, pricing, stack, security, privacy, ai, hosting, infrastructure, procurement, relationships, proof, people, documents, evidence, cards, faq. Omit for every section."
}
}
}Find the published Trooth Network record for a company given a domain, web address, Trooth slug or name; a company-register identifier, Crunchbase address or Wikidata ID is accepted and answered not_found, because Trooth keeps no lookup by them. Returns the record ID, its canonical https address and why it matched, or every candidate with why each matched (status ambiguous, none chosen), or not_found. Read only.
| Argument | Type | Description |
|---|---|---|
| kind | string | Optional. What the identifier is; read from its form when omitted. A register identifier is read as a name unless kind says otherwise. |
| identifier* | string | A domain, web address, Trooth slug, legal or trading name, company-register identifier, Crunchbase address or Wikidata ID |
{
"type": "object",
"required": [
"identifier"
],
"properties": {
"kind": {
"enum": [
"domain",
"url",
"slug",
"legal_name",
"registry_identifier",
"crunchbase_url",
"wikidata_id"
],
"type": "string",
"maxLength": 20,
"description": "Optional. What the identifier is; read from its form when omitted. A register identifier is read as a name unless kind says otherwise."
},
"identifier": {
"type": "string",
"maxLength": 2048,
"description": "A domain, web address, Trooth slug, legal or trading name, company-register identifier, Crunchbase address or Wikidata ID"
}
}
}Search the companies published on the Trooth Network by name, domain, tagline or category, optionally within one industry. Returns up to 10 entries per page (limit takes 1 to 200) in slug order with next_cursor; only the first 100 matches are read, so at most 100 come back, each with its name and tagline in the company's own words, whether Trooth witnessed it, and the identifier that reads its record with trooth_public_trust_profile. Read only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Optional. How many entries per page, 1 to 200 (default 10). |
| query* | string | Words to match: a company name, a domain, a category such as payroll or observability |
| cursor | string | Optional. The next_cursor (also at page.next_cursor) of the previous answer, sent with the same query and industry. |
| industry | string | Optional. Only companies in this industry, e.g. Fintech |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Optional. How many entries per page, 1 to 200 (default 10)."
},
"query": {
"type": "string",
"maxLength": 200,
"description": "Words to match: a company name, a domain, a category such as payroll or observability"
},
"cursor": {
"type": "string",
"maxLength": 512,
"description": "Optional. The next_cursor (also at page.next_cursor) of the previous answer, sent with the same query and industry."
},
"industry": {
"type": "string",
"maxLength": 100,
"description": "Optional. Only companies in this industry, e.g. Fintech"
}
}
}One answer from the company's signed record: the signed sentence word for word, its value in standard form, its conditions, when it was signed, who stated it, the check link, the fact ID and the version hash. The question is matched in a fixed order (fact ID, the record's question map, words that name a fact type, word overlap) and matched_by names the step. More than one fitting fact, or a name two companies share, returns the candidates and picks none; nothing fitting returns not_published, never a nearby fact. No generated text. No key needed.
| Argument | Type | Description |
|---|---|---|
| company* | string | The company: its Trooth ID, its domain or its name. |
| fact_id | string | Optional: a fact ID instead of a question. |
| question | string | Optional: the question, at most 300 characters. |
{
"type": "object",
"required": [
"company"
],
"properties": {
"company": {
"type": "string",
"description": "The company: its Trooth ID, its domain or its name."
},
"fact_id": {
"type": "string",
"description": "Optional: a fact ID instead of a question."
},
"question": {
"type": "string",
"description": "Optional: the question, at most 300 characters."
}
},
"additionalProperties": false
}The company's signed facts as JSON-LD. For a large record, send page_size for one page of facts at a time and next_cursor back as cursor. No key needed.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Optional: the next_cursor of the page before. |
| page_size | integer | Optional: 1 to 1,000 facts a page. |
| trooth_id* | string | The company's Trooth ID. |
{
"type": "object",
"required": [
"trooth_id"
],
"properties": {
"cursor": {
"type": "string",
"description": "Optional: the next_cursor of the page before."
},
"page_size": {
"type": "integer",
"description": "Optional: 1 to 1,000 facts a page."
},
"trooth_id": {
"type": "string",
"description": "The company's Trooth ID."
}
},
"additionalProperties": false
}Check my site. Sign in to Trooth, or send an agent key, to see what it takes and to use it.
No arguments.
{
"type": "object",
"properties": {}
}How to put it on the site. Sign in to Trooth, or send an agent key, to see what it takes and to use it.
No arguments.
{
"type": "object",
"properties": {}
}One page of a company's signed copy as markdown, by its path on the company's site. No key needed.
| Argument | Type | Description |
|---|---|---|
| path* | string | The page's path, for example /pricing. |
| trooth_id* | string | The company's Trooth ID. |
{
"type": "object",
"required": [
"trooth_id",
"path"
],
"properties": {
"path": {
"type": "string",
"description": "The page's path, for example /pricing."
},
"trooth_id": {
"type": "string",
"description": "The company's Trooth ID."
}
},
"additionalProperties": false
}The facts to review. Sign in to Trooth, or send an agent key, to see what it takes and to use it.
No arguments.
{
"type": "object",
"properties": {}
}Choose Basic or the full signed copy. Sign in to Trooth, or send an agent key, to see what it takes and to use it.
No arguments.
{
"type": "object",
"properties": {}
}Confirm the reviewed version. Sign in to Trooth, or send an agent key, to see what it takes and to use it.
No arguments.
{
"type": "object",
"properties": {}
}Read the website again. Sign in to Trooth, or send an agent key, to see what it takes and to use it.
No arguments.
{
"type": "object",
"properties": {}
}Sign and publish. Sign in to Trooth, or send an agent key, to see what it takes and to use it.
No arguments.
{
"type": "object",
"properties": {}
}Checks a statement about a company, sentence by sentence, against its current signed record by fixed rules with no model: supported (with the fact ID), differs (with the signed sentence), not_in_record, or not_checked for a sentence with no value a rule reads. It is meant for a price, an hour, a phone number or a date before it is repeated. To check one value before stating it, send fact_id and value instead: the answer is matches or differs by rule alone. No key needed.
| Argument | Type | Description |
|---|---|---|
| value | string | Check by value: the value as it will be stated, up to 1,000 characters. |
| fact_id | string | Check by value: the fact's ID. |
| statement | string | The text to check, up to 4,000 characters. |
| trooth_id* | string | The company's Trooth ID. |
{
"type": "object",
"required": [
"trooth_id"
],
"properties": {
"value": {
"type": "string",
"description": "Check by value: the value as it will be stated, up to 1,000 characters."
},
"fact_id": {
"type": "string",
"description": "Check by value: the fact's ID."
},
"statement": {
"type": "string",
"description": "The text to check, up to 4,000 characters."
},
"trooth_id": {
"type": "string",
"description": "The company's Trooth ID."
}
},
"additionalProperties": false
}Setup status and next step. Sign in to Trooth, or send an agent key, to see what it takes and to use it.
No arguments.
{
"type": "object",
"properties": {}
}Runs the whole guide, proving the domain, reading the site, reviewing and signing the facts, putting the signed copy on the site and checking it, and answers the one next call to make: next_action names the tool and its arguments. Each answer reflects the steps already done. A step only a person may take answers its trooth.co page.
| Argument | Type | Description |
|---|---|---|
| domain | string | The company's bare domain, when setup does not know it yet. |
| trooth_id | string | The company's trooth_id. Leave it out to use the one your key or sign-in acts for. |
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"maxLength": 253,
"description": "The company's bare domain, when setup does not know it yet."
},
"trooth_id": {
"type": "string",
"maxLength": 80,
"description": "The company's trooth_id. Leave it out to use the one your key or sign-in acts for."
}
},
"additionalProperties": false
}Check the two signatures on a Trust Ledger Token (tlt2. or tlt. form, or its JTI) against Trooth's own token ledger. A Trust Ledger Token is a signed token a company issues through Trooth about its own declared claims: the company signs the claims and Trooth signs the event of issuing it. Returns valid, invalid (a signature does not check out), expired or revoked, or unclaimed when no token matches; Trooth's signature covers the signing event, not the claim bytes and not the truth of the claims. With url in place of token, it checks a page Semanto signs against its signed copy: matches, differs or not signed, with the version, the signer and the proof address. It takes token or url, one of the two.
| Argument | Type | Description |
|---|---|---|
| url | string | A page Semanto signs (https), to check it against its signed copy. |
| hash | string | With url: the sha256: digest of the markdown the caller was served, compared in place of a fetch. |
| token | string | A Trust Ledger Token (tlt2. or tlt. form) or its JTI. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"minLength": 8,
"description": "A page Semanto signs (https), to check it against its signed copy."
},
"hash": {
"type": "string",
"maxLength": 80,
"description": "With url: the sha256: digest of the markdown the caller was served, compared in place of a fetch."
},
"token": {
"type": "string",
"maxLength": 16384,
"description": "A Trust Ledger Token (tlt2. or tlt. form) or its JTI."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 15, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
| idempotency_key | string | Optional. A key of the caller's choosing for this exact set of changes. Retrying with the same key and changes returns the first answer with no second write. When omitted, one is made and returned as idempotency_key. |
| expected_revision | string | Optional. The same as if_match, sent to trooth.co in the body. The revision the caller read; when the draft changed since, nothing is saved and the answer is code revision_changed. With if_match, both name the same revision. |
{
"type": "object",
"required": [
"changes"
],
"properties": {
"fields": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]+$",
"maxLength": 300,
"minLength": 1
},
"maxItems": 50,
"description": "Optional, with dry_run. Only these parts of the draft the dry run would keep come back: top-level keys or JSON Pointers. Leave it out for the whole draft."
},
"changes": {
"type": "array",
"items": {
"type": "object",
"required": [
"path"
],
"properties": {
"op": {
"enum": [
"set",
"remove",
"append"
],
"type": "string",
"description": "Optional. set (the default), remove, or append to a list."
},
"path": {
"type": "string",
"maxLength": 300,
"description": "The field, as an RFC 6901 JSON Pointer: /tagline, /security/contact, /founders/0/name, or /founders/- to add to the end of a list."
},
"state": {
"enum": [
"not_published",
"not_applicable"
],
"type": "string",
"description": "Instead of a value: the company does not publish this (not_published) or it does not apply (not_applicable). Clears the field. Needs a reason."
},
"value": {
"description": "The new value, of the field's type. Required unless state is given or op is remove. A picture (/logoUrl, /coverUrl, /founders/0/photoUrl) is a direct https link or the image file itself as a base64 data: URL (data:image/png;base64,..., PNG, JPEG or WebP, at most 140,000 bytes); trooth.co re-encodes and stores its own copy."
},
"reason": {
"type": "string",
"maxLength": 500,
"description": "With state: one sentence on what the caller checked, for example: The security page does not mention penetration testing."
},
"source": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2000,
"description": "The https address of the company's own page the value was read from."
},
"quote": {
"type": "string",
"maxLength": 2000,
"description": "The words on that page, or what the person said."
},
"person": {
"type": "boolean",
"description": "true: the company states this value itself, for example its phone number, and no page carries it. Kept as stated by the signed-in person, or by the agent key and its maker."
},
"retrieved_at": {
"type": "string",
"maxLength": 40,
"description": "When the caller read the page (RFC 3339), optional."
}
},
"description": "Where the value came from. Required for every non-empty value: the https page it was read from, or person: true for the company's own statement no page carries, such as its phone number (kept as stated by the signed-in person, or by the agent key and the person who made it). Without either, the change is rejected with code source_required."
}
},
"additionalProperties": false
},
"maxItems": 200,
"minItems": 1,
"description": "The changes, applied in order; a rejected change leaves the draft as it was and the ones after it still apply. Fields and their types: https://trooth.co/api/v1/profile/schema. Fields a person keeps (the page address, the theme, review marks) are rejected with code human_only."
},
"dry_run": {
"type": "boolean",
"description": "Optional. true checks every change and returns what would be kept, and saves nothing."
},
"if_match": {
"type": "string",
"maxLength": 100,
"description": "Optional. The revision the caller read with trooth_profile_get. When someone changed the draft since, nothing is saved and the answer is code revision_changed with the new revision."
},
"workspace": {
"type": "string",
"pattern": "^cid_[0-9a-f]{32}$",
"maxLength": 36,
"description": "With the person's sign-in only: the workspace to act on when the person belongs to more than one, by its trooth.co key (Settings, Organizations). Leave it out for the caller's own workspace or the caller's only one."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Optional. A key of the caller's choosing for this exact set of changes. Retrying with the same key and changes returns the first answer with no second write. When omitted, one is made and returned as idempotency_key."
},
"expected_revision": {
"type": "string",
"maxLength": 100,
"description": "Optional. The same as if_match, sent to trooth.co in the body. The revision the caller read; when the draft changed since, nothing is saved and the answer is code revision_changed. With if_match, both name the same revision."
}
},
"additionalProperties": false
}