
Company News
Free Business Plan Upgrades for Open Source Maintainers
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.
@attrove/mcp
Advanced tools
MCP server for Attrove — AI-powered context retrieval from Gmail, Slack, Calendar for Claude, Cursor, and ChatGPT
MCP (Model Context Protocol) server for Attrove. Enables AI assistants like Claude and Cursor to access your users' unified context from Gmail, Slack, Google Calendar, and more.
npm install @attrove/mcp
# or
yarn add @attrove/mcp
# or
pnpm add @attrove/mcp
Use the CLI as the identity and setup layer:
npx @attrove/cli login
npx @attrove/cli mcp install
npx @attrove/cli whoami
This stores credentials globally, wires up supported local MCP clients, and avoids embedding sk_ secrets directly into client JSON.
Claude Desktop supports two transport options:
HTTP transport (recommended) — uses OAuth 2.1, no API key needed:
{
"mcpServers": {
"attrove": {
"type": "streamable-http",
"url": "https://api.attrove.com/mcp"
}
}
}
Stdio transport — if you are not using the Attrove CLI, add this manually to Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"attrove": {
"command": "npx",
"args": ["-y", "@attrove/mcp@latest"],
"env": {
"ATTROVE_SECRET_KEY": "sk_...",
"ATTROVE_USER_ID": "user-uuid"
}
}
}
}
Cmd+, on macOS, Ctrl+, on Windows/Linux)npx @attrove/cli mcp install:{
"mcpServers": {
"attrove": {
"command": "npx",
"args": ["-y", "@attrove/mcp@latest"],
"env": {
"ATTROVE_SECRET_KEY": "sk_...",
"ATTROVE_USER_ID": "user-uuid"
}
}
}
}
If using Claude Code in the terminal, prefer npx @attrove/cli login first. Manual environment-variable configuration is also supported:
export ATTROVE_SECRET_KEY="sk_..."
export ATTROVE_USER_ID="user-uuid"
ChatGPT and other AI assistants that support MCP connectors can connect via the hosted HTTP endpoint.
Note: ChatGPT's connector interface may change over time. If these steps don't match your experience, refer to OpenAI's current documentation for the latest instructions.
Basic requirements:
https://api.attrove.com/mcpsk_...)X-Attrove-User-Id with your user UUIDExample setup steps (may vary):
Attrovehttps://api.attrove.com/mcpsk_...)X-Attrove-User-IdOnce connected, you can ask ChatGPT questions like:
npx @attrove/cli login
npx @attrove/cli mcp install
# or manual env injection:
ATTROVE_SECRET_KEY=sk_... ATTROVE_USER_ID=user-uuid npx @attrove/mcp
Once connected, you can ask your AI assistant natural language questions. Here are some examples:
Meeting prep:
"What context do I need for my 2pm meeting with the marketing team?"
Email follow-ups:
"Are there any emails from last week that I haven't responded to?"
Project status:
"What's the latest on the Q4 roadmap discussions?"
People search:
"What has John from Acme Corp been asking about recently?"
Historical context:
"Find the thread where we discussed the pricing changes last month"
attrove_queryAsk questions about the user's communications and get AI-generated answers.
Parameters:
query (required): The question to askintegration_ids (optional): Filter to specific integration IDs (array of UUID strings)include_sources (optional): Include source snippets in the responseinstructions (optional): Custom instructions for the AI — controls output format, filtering, and behavior. Takes priority over default style. Max 20,000 charscontext (optional): Authoritative reference data for answer generation. Treated as ground truth by the AI. Influences query rewriting but not used for vector search. Max 20,000 charsExample prompts:
attrove_searchSearch for specific messages or conversations.
Parameters:
query (required): The search queryafter_date (optional): Only messages after this date (YYYY-MM-DD)before_date (optional): Only messages before this date (YYYY-MM-DD)sender_domains (optional): Filter by sender domainsinclude_body_text (optional): Include message content in results (default: true, bodies truncated to 1000 characters)Example prompts:
attrove_integrationsList the user's connected integrations.
Parameters: None
Example prompts:
attrove_eventsList calendar events from the user's connected calendar accounts.
Parameters:
start_date (optional): Start of date range (YYYY-MM-DD)end_date (optional): End of date range (YYYY-MM-DD)limit (optional): Max events to return (default 25, max 100)Example prompts:
attrove_meetingsList meetings with AI-generated summaries and action items.
Parameters:
start_date (optional): Start of date range (YYYY-MM-DD)end_date (optional): End of date range (YYYY-MM-DD)provider (optional): Filter by meeting provider (google_meet, zoom, teams)limit (optional): Max meetings to return (default 10, max 50)Example prompts:
| Variable | Required | Description |
|---|---|---|
ATTROVE_SECRET_KEY | Yes | Your Attrove secret key (sk_...) |
ATTROVE_USER_ID | Yes | User ID to scope API calls |
ATTROVE_BASE_URL | No | Custom API base URL |
ATTROVE_DEBUG | No | Set to true for verbose error logging |
You can also use the server programmatically:
import { createServer, startServer } from '@attrove/mcp';
// Create a server instance
const server = createServer({
apiKey: 'sk_...',
userId: 'user-uuid'
});
// Or start directly with stdio transport
await startServer({
apiKey: 'sk_...',
userId: 'user-uuid'
});
For AI assistants that connect via HTTP (like ChatGPT), use the hosted endpoint:
# Test the endpoint
curl -X POST https://api.attrove.com/mcp \
-H "Authorization: Bearer sk_..." \
-H "X-Attrove-User-Id: user-uuid" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
Or integrate in your own server using the HTTP handler:
import { createHttpHandler } from '@attrove/mcp';
const handler = createHttpHandler(
{
apiKey: 'sk_...',
userId: 'user-uuid',
baseUrl: 'https://api.attrove.com', // optional: custom API endpoint
},
{
enableJsonResponse: true, // optional: use JSON instead of SSE (default: true)
timeoutMs: 30000, // optional: request timeout in ms (default: 30000)
}
);
// With Fastify (recommended)
fastify.post('/mcp', async (request, reply) => {
const result = await handler.handleRequest(request.raw, reply.raw, request.body);
if (!result.handled) {
// Handle timeout with 504, other errors with 500
const statusCode = result.isTimeout ? 504 : 500;
const userMessage = result.isTimeout
? 'Request timed out. Try a simpler query or reduce the scope.'
: 'An unexpected error occurred. Please try again.';
// Only send response if headers haven't been sent (e.g., during streaming)
if (!reply.raw.headersSent) {
reply.code(statusCode).send({
success: false,
error: { code: result.isTimeout ? 'REQUEST_TIMEOUT' : 'INTERNAL_ERROR', message: userMessage }
});
} else if (!reply.raw.writableEnded) {
reply.raw.end(); // Ensure stream is closed
}
return;
}
// Optional: monitor cleanup failures for resource leak detection
if (result.cleanupFailed) {
console.warn('MCP cleanup failed - potential resource leak');
}
});
// With raw Node.js HTTP server
import { createServer } from 'node:http';
const server = createServer(async (req, res) => {
// Note: You'll need to parse the body yourself for raw HTTP
const result = await handler.handleRequest(req, res);
if (!result.handled) {
res.writeHead(500, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: result.error }));
}
});
sk_...)import { Attrove } from '@attrove/sdk';
const admin = Attrove.admin({
clientId: 'your-client-id',
clientSecret: 'your-client-secret'
});
// Create a user
const { id, apiKey } = await admin.users.create({
email: 'user@example.com'
});
// Use `apiKey` as ATTROVE_SECRET_KEY and `id` as ATTROVE_USER_ID
Make sure you've set the environment variables correctly in your MCP configuration.
Set ATTROVE_DEBUG=true to enable verbose error logging with stack traces:
{
"mcpServers": {
"attrove": {
"command": "npx",
"args": ["-y", "@attrove/mcp@latest"],
"env": {
"ATTROVE_SECRET_KEY": "sk_...",
"ATTROVE_USER_ID": "user-uuid",
"ATTROVE_DEBUG": "true"
}
}
}
}
The Attrove API has rate limits. If you're making many requests, you may need to wait before trying again.
For AI assistants and code generation tools, Attrove provides machine-readable documentation:
https://attrove.com/llms.txt - Condensed API reference for LLMshttps://github.com/attrove/examples - Example code with CLAUDE.md contextMIT
FAQs
Catch conversations going quiet — watch outcomes and search Gmail, Slack, and meetings. One MCP.
The npm package @attrove/mcp receives a total of 86 weekly downloads. As such, @attrove/mcp popularity was classified as not popular.
We found that @attrove/mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.

Security News
During a UK cyber test, a Mythos 5 agent used sockpuppets, social engineering, and prompt injection to try to get a maintainer to merge malware.