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
- Create a workspace (free beta).
- Open Settings → Agents & API and create a key. It starts with
gt_and is shown once. - Point your agent at
https://groundtruthhq.tech/api/mcpwithAuthorization: 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)
- 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).
- Claude opens a Groundtruth sign-in. Log in, pick the workspace Claude may use and click Allow.
- Ask something like “What's our refund policy?” or “What's on our board for this week?”
https://groundtruthhq.tech/api/mcpClaude Code
claude mcp add --transport http groundtruth https://groundtruthhq.tech/api/mcpThen 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
{
"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:
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.
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 citedsources(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
contractscollection:end_date,notice_days,auto_renew,owner,value_annual. Writescancel_by,days_until_cancel_by,contract_status. - Churn Agent reads
customers(renewal,health,mrr,usage_change_pct) andinteractions(customer,date,type,sentiment,nps,summary). Writeschurn_risk,churn_level,churn_reasons. - Freshness Agent flags pages not verified within 90 days.
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
askreadAsk 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*
searchreadKeyword search across pages, decisions and records. Returns ranked hits with snippets and ids you can pass to get_page.
query*, types, limit
list_pagesreadList pages (id, title, space, tags, owner, staleness). Optionally filter by space or tag.
space, tag
get_pagereadRead a full page as markdown, with owner, last editor (human or agent) and staleness.
page*
create_pagewriteCreate 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_pagewriteReplace 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_pagewriteAppend markdown to the end of a page (e.g. an incident timeline entry, meeting notes, a new FAQ).
page*, text*, summary
list_decisionsreadList the decision log (newest first): what was decided, why, by whom, and status.
status, tag
log_decisionwriteRecord 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_recordsreadQuery 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_recordwriteCreate a record, or update it if one with the same collection+title (or id) exists. Fields are merged.
collection*, title*, fields, id
get_activityreadRecent changes in the workspace, newest first, with who made them and whether they were a human or an agent.
limit, actor_type
list_alertsreadOpen 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_alertwriteMark an alert resolved (handled) or dismissed (not relevant), with a short note on what was done.
alert_id*, status, note
list_agentsreadThe Agent Store: which agents exist, which are installed in this workspace, their settings and last run.
run_agentwriteRun 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_interactionwriteRecord 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_tasksreadCards 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_taskwriteAdd 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_taskwriteMove 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_taskwriteAdd a progress note, question or result to a card.
task_id*, text*
whoamireadWhich 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.