Dovetail MCP

Live

OAUTH 2.0

ANALYTICS

Analytics

Let your agent search customer research, pull insights and highlights, and create notes in Dovetail as the researcher who owns the workspace.

  • Acts as the researcher. Every insight read and note created is attributed to the real user, not a shared research bot.
  • Tokens stay vaulted. Dovetail OAuth credentials sit in an AES-256 vault, resolved per request, never in the prompt.
  • Scoped before every call. Project and workspace scopes enforced ahead of each API call, with a 90-day audit trail.
Dovetail MCP
agent · Acme Q3
Run
What are customers saying about onboarding friction this quarter?
S
dovetail_insights_search
104ms
Dovetail agent
Found 4 insights on onboarding friction. Top themes: confusing setup wizard (18 highlights), slow first-value (11 highlights), and unclear pricing tiers (7 highlights).
Sources: 4 insights, Onboarding Research project, this quarter
dovetailmcp
4 insights
18:29
Message Claude...

Tools your research agent reaches for on Dovetail, scoped per user.

CALL ANY TOOL
Search insights and highlights, read projects and notes, and capture new findings, each call scoped to the authenticated researcher's workspace access.
dovetail_projects_list
List projects
List the research projects the authenticated user can access in the workspace.
Parameters
Name
Type
Required
Description
query
string
Optional
Filter projects by name or keyword
limit
integer
Optional
Max projects to return (default 50)
dovetail_project_get
Get project
dovetail_insights_search
Search insights
dovetail_insight_get
Get insight
dovetail_highlights_list
List highlights
dovetail_note_create
Create note
dovetail_data_search
Search data
Build your Agent
The same per-user auth pattern wires into every agent framework.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["dovetailmcp"], toolNames: ["dovetail_insights_search", "dovetail_insight_get", "dovetail_highlights_list"] },
pageSize: 100,
});

const agent = createReactAgent({ llm: new ChatOpenAI({ model: "gpt-4o" }), tools });
await agent.invoke({ messages: [{ role: "user", content: "Summarise onboarding friction insights" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const openai = new OpenAI();
const sk = new ScalekitClient(process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["dovetailmcp"], toolNames: ["dovetail_insights_search", "dovetail_insight_get", "dovetail_highlights_list"] },
pageSize: 100,
});

const res = await openai.responses.create({
model: "gpt-4o",
input: "Search insights about onboarding friction",
tools,
});
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const anthropic = new Anthropic();
const sk = new ScalekitClient(process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["dovetailmcp"], toolNames: ["dovetail_insights_search", "dovetail_insight_get", "dovetail_highlights_list"] },
pageSize: 100,
});

const msg = await anthropic.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
tools,
messages: [{ role: "user", content: "Pull highlights linked to the pricing insight" }],
});
import { LlmAgent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["dovetailmcp"], toolNames: ["dovetail_insights_search", "dovetail_insight_get", "dovetail_highlights_list"] },
pageSize: 100,
});

const agent = new LlmAgent({ name: "dovetail_agent", model: "gemini-2.0-flash", tools });
await agent.run("List insights in the onboarding project");
Try these prompts
Paste any prompt into your agent to start working Dovetail research.
Search & synthesize
Copy the prompt
Copied
What are customers saying about onboarding friction this quarter?
Copy the prompt
Copied
Find insights tagged pricing across all my projects.
Copy the prompt
Copied
Summarise the top themes in the Q2 discovery project.
Investigate
Copy the prompt
Copied
Pull the highlights linked to the checkout confusion insight.
Copy the prompt
Copied
Show me raw transcript data that mentions slow first-value.
Copy the prompt
Copied
Which project has the most highlights about mobile bugs?
Capture & recall
Copy the prompt
Copied
Create a note in the onboarding project summarising this week's calls.
Copy the prompt
Copied
List all research projects I have access to.
Copy the prompt
Copied
How many insights are published in the retention study?
SEE HOW AUTH WORKS
The researcher authorises Dovetail once. Every later agent call uses their token with project scope enforced.
1
Authorize
Your user connects
Dovetail MCP
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Dovetail MCP
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Dovetail MCP
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Dovetail MCP
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other analytics connectors.
No items found.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
Other connector libraries treat auth as a demo afterthought. Research data needs real per-user attribution.
01.
Shared tokens break per-user analytics
A shared Dovetail token looks fine in a demo. In production every note and edit logs as one service account, so you lose track of which researcher acted. Scalekit resolves the real user's credential per call.
// shared token
create_note → research_bot

// scalekit
create_note → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Dovetail today. Others tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Dovetail as the user or as a shared key?
As the user. Scalekit resolves the authenticated researcher's own Dovetail credential at request time, so every insight read, note, and edit is attributed to them in the workspace rather than a shared research bot.
Where is the Dovetail token stored?
In an AES-256 encrypted vault, namespaced per tenant. Tokens are fetched only at the moment of a tool call, refreshed automatically before expiry, and revocable from a single dashboard, never exposed to the model or the prompt.
Can I limit what the agent is allowed to do in Dovetail?
Yes. Pass a toolNames filter to listScopedTools to expose only the actions you want, for example read-only insight and highlight search without note creation. Scalekit also runs a scope check before each API call.
What happens when a user revokes Dovetail access?
The credential is invalidated at the next tool call, which fails closed rather than falling back to a shared token. Other users are unaffected, and the revocation is recorded in the audit trail.
Can the agent search raw transcripts, or only published insights?
That is your choice. Expose dovetail_insights_search and dovetail_highlights_list for a synthesis agent that reads finished insights, or add dovetail_data_search to let it query raw transcripts, tickets, and call notes. Each call is scoped per user, so a researcher can only reach data in projects they already own.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""dovetailmcp"": {
""url"": ""https://mcp.scalekit.com/dovetailmcp"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.dovetailmcp]
url = ""https://mcp.scalekit.com/dovetailmcp""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""dovetailmcp"": {
""url"": ""https://mcp.scalekit.com/dovetailmcp"",
""type"": ""http""
}
}
}