Docs

Connect your agents

Groundtruth speaks MCP (Streamable HTTP) and plain REST. Every tool an agent can call is also an endpoint, and everything a human can do in the app, an agent can do too.

Quickstart

  1. Create a workspace (free beta).
  2. Open Settings → Agents & API and create a key. It starts with gt_ and is shown once.
  3. Point your agent at https://groundtruthhq.tech/api/mcp with Authorization: Bearer gt_….

Claude

Connect Groundtruth to Claude and ask about your company in any chat: Claude searches your pages, decisions and records and answers with citations. It can also write back: log a decision, add to a page, update a record or move a card on your board. You need a Groundtruth account and a workspace.

Claude (web, desktop, mobile)

  1. In Claude, open Settings → Connectors, choose Add custom connector, name it Groundtruth and paste the URL below (or add Groundtruth from the connector directory once it's listed).
  2. Claude opens a Groundtruth sign-in. Log in, pick the workspace Claude may use and click Allow.
  3. Ask something like “What's our refund policy?” or “What's on our board for this week?”
url
https://groundtruthhq.tech/api/mcp

Claude Code

shell
claude mcp add --transport http groundtruth https://groundtruthhq.tech/api/mcp

Then run /mcp in Claude Code to sign in. An API key header also works for scripts and CI: --header "Authorization: Bearer gt_YOUR_KEY".

What Claude can do

  • Read (no confirmation needed): ask, search, list and read pages, decisions, records, activity, alerts, agents and board cards.
  • Write (Claude asks you first): create or update pages, log decisions, upsert records, log customer interactions, resolve alerts, run an installed agent, and create, update or comment on board cards.
  • Every write is labelled as an AI-agent edit and attributed to the connection in the activity log. Pages an agent writes are marked Needs review for their owner, and every page edit can be restored from the page's history. Agents can't delete pages or cards, verify pages, or mark cards done.

Data and privacy

The connection can reach one workspace: the one you picked. It sees what a member of that workspace sees and nothing else, and Groundtruth doesn't receive your Claude conversations, only the tool calls Claude makes. Answers to agents come back as cited sources, so no AI model runs on our side for them. See the privacy policy and AI transparency.

Disconnect

Remove the connector in Claude, or revoke the connection in Groundtruth under Settings & API → API keys (it's listed as “Claude”). Revoking takes effect immediately. Workspace owners can revoke any connection in their workspace.

Troubleshooting

  • The sign-in shows no workspaces: create one first at your workspaces, then connect again.
  • “Authorization failed” after it worked before: the connection was revoked or you left the workspace. Remove the connector in Claude and add it again.
  • Anything else: email hello@groundtruthhq.tech.

Under the hood: OAuth 2.1 with PKCE (S256), Client ID Metadata Documents and Dynamic Client Registration, per the MCP authorization spec; rotating refresh tokens. Discovery at /.well-known/oauth-protected-resource.

Cursor and other MCP clients

json · .cursor/mcp.json
{
  "mcpServers": {
    "groundtruth": {
      "url": "https://groundtruthhq.tech/api/mcp",
      "headers": { "Authorization": "Bearer gt_YOUR_KEY", "X-Agent-Name": "Cursor" }
    }
  }
}

Optional X-Agent-Name sets the name shown in the activity log (defaults to the key's name).

Your own agent

With the Claude API's MCP connector, Claude calls Groundtruth directly:

python
import anthropic

client = anthropic.Anthropic()
resp = client.beta.messages.create(
    model="claude-opus-5-5",
    max_tokens=1024,
    mcp_servers=[{
        "type": "url",
        "url": "https://groundtruthhq.tech/api/mcp",
        "name": "groundtruth",
        "authorization_token": "gt_YOUR_KEY",
    }],
    tools=[{"type": "mcp_toolset", "mcp_server_name": "groundtruth"}],
    messages=[{"role": "user", "content": "What's our refund policy? Cite the page."}],
    betas=["mcp-client-2025-11-20"],
)

REST API

Every MCP tool is also POST /api/v1/<tool> with the tool's arguments as the JSON body. Read-only tools accept GET with query parameters. GET /api/v1 lists them.

shell
curl -s https://groundtruthhq.tech/api/v1/ask \
  -H "Authorization: Bearer gt_YOUR_KEY" -H 'content-type: application/json' \
  -d '{"question":"Who approves refunds over $5,000?"}'

# Read-only tools also take GET with query parameters:
curl -s "https://groundtruthhq.tech/api/v1/query_records?collection=customers&sort=-mrr" -H "Authorization: Bearer gt_YOUR_KEY"

Tokens & your AI key

  • Agents use their own model. When an agent calls ask, Groundtruth returns the cited sources (plus a quick extractive draft) and makes no model call. Your agent writes the final answer with whatever model it already runs.
  • The web app uses your key. Add an Anthropic or OpenAI key in Settings → AI. Keys are encrypted (AES-256-GCM), verified by listing your models (no tokens spent), and never shown again. Usage is billed by your provider with zero markup.
  • No key, still cited. Without a key, answers in the app are stitched from the best-matching sentences, with the same citations.

Agent Store

Install agents from Agent Store in your workspace. They run daily at 06:00 UTC (or on demand), write findings back to your records attributed to the agent, and raise alerts. Connect a Slack incoming webhook in Settings → Alert notifications to get them in a channel.

  • Contract Agent reads the contracts collection: end_date, notice_days, auto_renew, owner, value_annual. Writes cancel_by, days_until_cancel_by, contract_status.
  • Churn Agent reads customers (renewal, health, mrr, usage_change_pct) and interactions (customer, date, type, sentiment, nps, summary). Writes churn_risk, churn_level, churn_reasons.
  • Freshness Agent flags pages not verified within 90 days.
shell · feed the Churn Agent from any agent
curl -s https://groundtruthhq.tech/api/v1/log_interaction -H "Authorization: Bearer gt_YOUR_KEY" \
  -H 'content-type: application/json' \
  -d '{"customer":"Initech","type":"ticket","sentiment":"negative","summary":"Third outage this month; asked about cancellation terms"}'

Tool reference

askread

Ask a natural-language question about the company. Returns the most relevant sources (pages, decisions, records) with numbered citations and a quick draft answer; compose your final answer from `sources` and cite them as [n]. Use this first for any 'what/who/how/why' question about how the company works.

question*

searchread

Keyword search across pages, decisions and records. Returns ranked hits with snippets and ids you can pass to get_page.

query*, types, limit

list_pagesread

List pages (id, title, space, tags, owner, staleness). Optionally filter by space or tag.

space, tag

get_pageread

Read a full page as markdown, with owner, last editor (human or agent) and staleness.

page*

create_pagewrite

Create a new markdown page. Search first to avoid duplicates. The page is attributed to you (an agent) in the activity log.

title*, body*, space, tags, owner

update_pagewrite

Replace a page's title, body, space, tags or owner. Prefer append_to_page for adding notes. Include a short summary of what changed and why.

page*, title, body, space, tags, owner, summary*

append_to_pagewrite

Append markdown to the end of a page (e.g. an incident timeline entry, meeting notes, a new FAQ).

page*, text*, summary

list_decisionsread

List the decision log (newest first): what was decided, why, by whom, and status.

status, tag

log_decisionwrite

Record a decision with its context so humans and agents can later ask 'why is it like this?'. Use status 'proposed' if a human still needs to approve it.

title*, decision*, context, status, owner, date, tags

query_recordsread

Query structured records (e.g. customers, metrics, people, vendors). `where` supports exact match {field: value} or operators {field: {gt|gte|lt|lte|contains: value}}. `sort` is a field name, prefix '-' for descending. Call without collection to list collections.

collection, where, sort, limit

upsert_recordwrite

Create a record, or update it if one with the same collection+title (or id) exists. Fields are merged.

collection*, title*, fields, id

get_activityread

Recent changes in the workspace, newest first, with who made them and whether they were a human or an agent.

limit, actor_type

list_alertsread

Open alerts raised by the workspace's agents (contract deadlines, churn risk, stale pages), most urgent first. Check this when asked what needs attention.

status, agent, limit

resolve_alertwrite

Mark an alert resolved (handled) or dismissed (not relevant), with a short note on what was done.

alert_id*, status, note

list_agentsread

The Agent Store: which agents exist, which are installed in this workspace, their settings and last run.

run_agentwrite

Run an installed agent immediately (they also run daily). Returns its summary and any new alerts. New alerts may be posted to the workspace's alert webhook (e.g. Slack) if one is set.

agent*

log_interactionwrite

Record an interaction with a customer (meeting, email, ticket, call, NPS response). Feeds the Churn Agent's risk scores.

customer*, type, date, sentiment, nps, summary*

list_tasksread

Cards on the workspace's kanban board, by priority. Filter by status (todo, doing, blocked, review, done) and assignee (a person's name, an agent's name like 'Claude', 'me', or 'unassigned'). Check your own column with assignee='me'. `stale: true` marks work stuck in progress for 6h+.

status, assignee, assignee_type, limit

create_taskwrite

Add a card to the board. Assign it to a person (their name) when a human must act (e.g. buy a domain, approve spend), or to an agent by name. Put clear, step-by-step instructions in the description.

title*, description, assignee, assignee_type, status, priority, due

update_taskwrite

Move a card (status), reassign it, edit it, or add a comment in the same call. Statuses: todo, doing, blocked, review, done. Agents can move cards up to 'review'; only people can mark them 'done'.

task_id*, status, assignee, assignee_type, title, description, priority, due, comment

comment_taskwrite

Add a progress note, question or result to a card.

task_id*, text*

whoamiread

Which workspace this connection is for, who you are acting as, and whether you can write.

Markdown & llms.txt

Every page has a plain markdown twin with front-matter at /w/<workspace>/p/<id>.md, and every workspace publishes an index at /w/<workspace>/llms.txt.

Security model

  • Keys are scoped to one workspace, stored as SHA-256 hashes, and revocable instantly.
  • Agent writes are attributed to the key (and optional agent name) and badged in the UI.
  • Ask never answers without a source; unanswerable questions are refused rather than guessed.
  • Rendered markdown never executes HTML or javascript: links.