brief-mcp
Performs web research through the Brave Search API to look up attendee profiles, company news, recent developments, and other contextual information for briefing cards.
Reads Google Calendar events and attendee details via OAuth2 to generate pre-meeting briefs, including upcoming meetings, attendees, and event context.
Enriches meeting briefs with HubSpot CRM data such as deal stage, lifecycle stage, and last-contact information for sales and partner meetings.
brief-mcp
Know everyone in the room before you walk in.
brief-mcp is the first open-source Model Context Protocol server for meeting intelligence. It connects Claude — and any MCP-compatible AI assistant — to your calendar, the web, your CRM, and your own meeting history, then generates executive-grade briefing cards in seconds.
No browser tabs. No LinkedIn spelunking. No manual prep.
Table of Contents
Related MCP server: Google MCP Server
What it does
brief-mcp gives your AI assistant five capabilities it doesn't have out of the box:
Capability | What it means |
Pre-meeting research | Reads your calendar, looks up every attendee on the web, and assembles a briefing card — who they are, what their company is doing, what to say |
Dual calendar support | Works with both Google Calendar (OAuth2) and Microsoft 365 / Outlook (Microsoft Graph) |
CRM enrichment | Pulls HubSpot deal stage, lifecycle, and last-contact data into the brief for sales and partner meetings |
Post-meeting memory | After a meeting, record what happened — auto-extract action items, draft the follow-up email, and save everything to a local SQLite database |
Persistent history | Before your next meeting with the same person, brief-mcp shows you everything that was said, promised, and decided before — building a relationship memory you actually own |
Demo
You open Claude and type: "Brief me for my 2pm call."
Claude responds:
============================================================
MEETING BRIEF: Q4 PARTNERSHIP REVIEW
============================================================
When : Tuesday, October 13 2026 at 02:00 PM
Duration: 60 minutes
Link : https://meet.google.com/abc-defg-hij
Attendees (3): Alice Chen (you), Bob Patel, Carol Wu
------------------------------------------------------------
ATTENDEE PROFILES
------------------------------------------------------------
>> Bob Patel
Role : VP of Engineering @ PartnerCo
Bio : Engineering leader, 15 years in distributed systems.
Previously Staff Engineer at Google and DataStream Inc.
Recent :
- Bob Patel promoted to VP of Engineering (Sept 2026)
- PartnerCo Engineering Blog: new latency benchmarks published
Co News :
- PartnerCo raises $50M Series B to accelerate AI platform
- PartnerCo announces APAC expansion, opens Singapore office
>> Carol Wu
Role : Director of Product @ PartnerCo
Bio : Product leader, ex-Google PM for Firebase.
Recent :
- Carol Wu joins PartnerCo from Google as Director of Product
- Carol Wu keynote at ProductCon SF 2026
------------------------------------------------------------
SUGGESTED TALKING POINTS
------------------------------------------------------------
1. Ask Bob about engineering priorities and how the integration fits
their new Kubernetes-native platform.
2. Reference the Series B — congratulate them and probe roadmap changes.
3. Carol is new from Google — don't assume prior integration context.
4. Confirm next-steps owner before the call ends.
------------------------------------------------------------
WATCH-OUTS / SENSITIVITIES
------------------------------------------------------------
! Series B funding may prompt renegotiation — know your commercial floor.
! Carol joined in 2026 — bring her up to speed on integration history.
Generated: 2026-10-13 09:14
============================================================Or for a returning customer meeting:
------------------------------------------------------------
PAST INTERACTION HISTORY — Bob Patel
------------------------------------------------------------
* Met 2026-07-18 — Product roadmap sync
Committed: "Send updated API latency benchmarks by Aug 1"
Status: Follow-up sent ✓
* Met 2026-09-02 — Q3 review
Committed: "Schedule infra deep-dive with their SRE team"
Status: OPEN — 41 days outstanding
Open action items from past meetings: 1
------------------------------------------------------------All of that from a single prompt. No switching tools, no browser tabs.
Why brief-mcp is different
The only meeting intelligence MCP server
As of October 2026, brief-mcp is the only open-source MCP server dedicated to meeting preparation, CRM enrichment, and post-meeting memory. A GitHub-wide search returns zero competing implementations.
End-to-end meeting lifecycle
Most tools address one phase. brief-mcp covers all three:
Before → During context → After
─────────────────────────────────────────────────────────
Brief Who's in the room, Debrief, action items,
calendar news, CRM context, follow-up email, memory,
past history open item trackingDual-calendar: Google + Microsoft 365
Supports both ecosystems with separate OAuth2 flows — Google Calendar via the Workspace API and Outlook via Microsoft Graph (MSAL device-code, headless-friendly). Most professionals use one or the other; brief-mcp supports both from one server.
Persistent relationship memory
brief-mcp builds a local SQLite database (with FTS5 full-text search) of every meeting you record. Before a repeat meeting, brief_with_history surfaces:
Every past meeting with that person
Commitments made and whether they were fulfilled
Topics that recur across sessions
How many days outstanding open action items have been sitting
No SaaS subscription. No cloud sync. Fully yours.
Engineered for correctness
Parallel async research —
asyncio.gatherfires all attendee lookups simultaneously; a 6-person meeting takes the same wall-clock time as a 1-person meetingTimezone-correct everywhere — Microsoft Graph timezone strings resolved via
ZoneInfoIANA and Windows→IANA mapping; all datetimes are timezone-aware throughoutTTL cache — 60-minute, 256-entry cache with dual-indexing (name+company and name-only) prevents cache misses when calendar lookups don't have company context
Full pagination — Google Calendar and Microsoft Graph results are paginated; no silent truncation at 25 items
123 tests, all offline — every integration is mocked; no credentials needed to run the full suite
Install
Zero-install (recommended)
uvx brief-mcpuvx runs brief-mcp in an isolated environment without a permanent install. Requires uv.
pip
pip install brief-mcpFrom source
git clone https://github.com/MLDreamer/brief-mcp
cd brief-mcp
uv sync
uv run brief-mcpQuick Start
Step 1 — Enable Google Calendar (5 minutes, one-time):
Go to Google Cloud Console → APIs & Services → Enable Google Calendar API → Credentials → Create OAuth 2.0 Client ID (Desktop app) → Download JSON.
Step 2 — Create .env in your working directory:
# Required for Google Calendar
GOOGLE_CREDENTIALS_PATH=/path/to/credentials.json
# Optional but recommended — free tier at brave.com/search/api
BRAVE_API_KEY=BSAxxx...
# Optional — Microsoft 365 / Outlook
AZURE_CLIENT_ID=your-azure-app-client-id
AZURE_TENANT_ID=common
# Optional — HubSpot CRM
HUBSPOT_API_KEY=pat-na1-xxxx...Step 3 — Configure your AI client (see section below).
Step 4 — Open Claude and say:
"Brief me for today's meetings."On first run, a browser window opens for Google OAuth consent. After that, fully silent.
Client Configuration
Claude Desktop
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"brief-mcp": {
"command": "uvx",
"args": ["brief-mcp"],
"env": {
"GOOGLE_CREDENTIALS_PATH": "/Users/you/credentials.json",
"BRAVE_API_KEY": "BSAxxx...",
"AZURE_CLIENT_ID": "your-client-id",
"HUBSPOT_API_KEY": "pat-na1-xxxx..."
}
}
}
}Restart Claude Desktop after saving.
VS Code / Cursor
Create .vscode/mcp.json in your workspace root:
{
"servers": {
"brief-mcp": {
"type": "stdio",
"command": "uvx",
"args": ["brief-mcp"],
"env": {
"GOOGLE_CREDENTIALS_PATH": "${workspaceFolder}/credentials.json",
"BRAVE_API_KEY": "BSAxxx...",
"HUBSPOT_API_KEY": "pat-na1-xxxx..."
}
}
}
}Zed
In ~/.config/zed/settings.json:
{
"assistant": {
"mcp_servers": {
"brief-mcp": {
"command": "uvx",
"args": ["brief-mcp"],
"env": {
"GOOGLE_CREDENTIALS_PATH": "/path/to/credentials.json",
"BRAVE_API_KEY": "BSAxxx..."
}
}
}
}
}Integrations
Google Calendar
Auth: OAuth2 desktop flow via google-auth-oauthlib. Token stored at ~/.brief-mcp/token.json and refreshed silently.
Required env var: GOOGLE_CREDENTIALS_PATH — path to the JSON file downloaded from Google Cloud Console.
Scopes used: calendar.readonly (optionally gmail.readonly for prior-email context).
Graceful degradation: If not configured, all Google Calendar tools return a clear message and continue working — research_attendee functions without any calendar.
Microsoft 365 / Outlook
Auth: MSAL device-code flow — headless-friendly, works in any terminal. Token stored at ~/.brief-mcp/ms_token.json and auto-refreshed.
Required env vars:
AZURE_CLIENT_ID=your-app-client-id
AZURE_TENANT_ID=common # "common" = personal + work accountsAzure Portal setup (one-time, 3 minutes):
Azure Portal → App registrations → New registration
Supported account types: Accounts in any organizational directory and personal Microsoft accounts
Redirect URI → Platform: Mobile and desktop →
https://login.microsoftonline.com/common/oauth2/nativeclientAPI Permissions → Microsoft Graph → Delegated → add
Calendars.Read+offline_access→ Grant admin consentCopy Application (client) ID → set as
AZURE_CLIENT_ID
On first run, brief-mcp prints:
To sign in, visit https://microsoft.com/devicelogin and enter code: ABCD1234After sign-in, all subsequent runs are silent.
Timezone handling: Microsoft Graph returns naive datetime strings with a separate timeZone field. brief-mcp resolves this using Python's zoneinfo for IANA names and a built-in Windows→IANA mapping for timezones like "Eastern Standard Time".
HubSpot CRM
Auth: Private app token (no OAuth callback required).
Required env var: HUBSPOT_API_KEY
HubSpot setup (5 minutes):
HubSpot → Settings → Integrations → Private Apps → Create a private app
Scopes:
crm.objects.contacts.read+crm.objects.deals.readGenerate token → copy → set as
HUBSPOT_API_KEY
What it fetches: Contact name, email, job title, company, lifecycle stage, last contacted date, and all associated deals (name, stage, amount, close date).
Graceful degradation: If HUBSPOT_API_KEY is not set, CRM tools return a helpful setup message instead of crashing.
Web Research
Primary: Brave Search API — set BRAVE_API_KEY for best results (free tier available, 2,000 queries/month).
Fallback: DuckDuckGo HTML endpoint — works with no configuration, no API key required. brief-mcp automatically falls back if Brave is not configured.
What it does per person: Fires 3 parallel searches — general bio, LinkedIn profile, and company news — then extracts current role, company, recent news headlines, and background from the combined results.
Meeting Memory
No configuration required. Memory is stored automatically at ~/.brief-mcp/memory.db — a local SQLite database using FTS5 full-text search.
The database stores:
Meeting records (title, date, attendees, summary, action items, outcomes)
Per-person interaction history (topics discussed, sentiment, commitments)
Action item status with per-item completion tracking
Data never leaves your machine.
All 13 Tools
Pre-Meeting: Google Calendar
get_upcoming_meetings
Reads your Google Calendar and returns all meetings in the next N hours.
Arguments:
hours_ahead: int = 24 # Look-ahead window in hours (max: 168 / 1 week)
Returns:
List of meetings, each with:
- id, title, start_time, end_time (timezone-aware)
- attendees: [{name, email, is_organizer}]
- meeting_url (Google Meet, Zoom, or Teams link if present)
- location, description, calendar_linkresearch_attendee
Researches a single person via parallel web search. Results are cached for 60 minutes.
Arguments:
name: str # Full name (required)
company: str = "" # Company name — improves search accuracy significantly
context: str = "" # Any extra context you know about this person
Returns:
PersonProfile with:
- current_role, company, background, linkedin_summary
- recent_news[] — recent headlines about this person
- company_news[] — recent headlines about their company
- research_sources[]get_meeting_brief
Looks up a meeting from your calendar and generates a full brief — attendee profiles, talking points, and watch-outs — all researched in parallel.
Arguments:
meeting_title: str = "" # Partial title match (case-insensitive)
meeting_id: str = "" # Exact ID from get_upcoming_meetings (takes priority)
hours_ahead: int = 24
Returns:
Formatted brief card as a multi-line string.
Returns an error with available meeting titles if no match found.brief_all_today
Generates briefs for every meeting on today's calendar. Deduplicates attendee research across meetings — if the same person appears in your 10am and 3pm, they are researched exactly once.
Arguments: none
Returns:
Full daily briefing — one card per meeting, separated by dividers.
Header shows total meeting count and date.brief_with_history
Same as get_meeting_brief but enriched with past interaction history from your local meeting memory. Shows what was discussed, committed, and decided in every prior meeting with each attendee.
Arguments:
meeting_title: str = ""
meeting_id: str = ""
hours_ahead: int = 24
Returns:
Standard brief card + past interaction section per attendee.
Shows open action items, recurring topics, and commitment status.Pre-Meeting: Microsoft 365
get_outlook_meetings
Reads your Outlook / Microsoft 365 calendar via Microsoft Graph. Returns the same format as get_upcoming_meetings.
Arguments:
hours_ahead: int = 24
Returns:
Same format as get_upcoming_meetings.
Requires AZURE_CLIENT_ID in env.get_outlook_brief
Generates a full brief from your Outlook calendar. Identical output format to get_meeting_brief.
Arguments:
meeting_title: str = ""
meeting_id: str = ""
hours_ahead: int = 24
Returns:
Formatted brief card string.CRM Enrichment
get_crm_context
Looks up a person in HubSpot CRM and returns their contact record and associated deals.
Arguments:
name: str # Full name
email: str = "" # Email address — used for exact-match lookup if provided
company: str = "" # Company name — improves search when name is common
Returns:
Formatted CRM summary:
- Name, job title, company, lifecycle stage
- Last contacted date
- All associated deals: name, stage, amount, close date
Returns "No CRM record found for {name}" if not found.enrich_brief_with_crm
Generates a standard meeting brief then appends a CRM section for every attendee found in HubSpot. Ideal for sales and partner meetings.
Arguments:
meeting_title: str # Matches against Google Calendar
Returns:
Full brief card + CRM CONTEXT section at the bottom.
Shows deal pipeline, stage, amount, and last activity per attendee.Post-Meeting Memory
debrief_meeting
Records what happened in a meeting. Saves to the local SQLite database, auto-extracts action items from free-form notes, and drafts a follow-up email.
Arguments:
meeting_title: str # Matches the calendar event (looks back 24h + ahead 2h)
notes: str # Raw meeting notes — bullet points, transcript, anything
action_items: str = "" # Comma-separated tasks (e.g. "Alice to send report, Bob to schedule demo")
outcomes: str = "" # What was decided or agreed
Returns:
Formatted debrief card:
- Structured meeting record saved to memory.db
- Extracted action items with inferred owners and due dates
- Draft follow-up email ready to send
- Next-step suggestions
Action item extraction recognises:
"ACTION: ..." "TODO: ..." "FOLLOW-UP: ..."
"- [ ] ..." "* [ ] ..."search_meeting_history
Full-text search across all past meetings using SQLite FTS5. Searches meeting title, attendees, summary, action items, and outcomes simultaneously.
Arguments:
query: str # Keyword, person name, company, topic, or date
limit: int = 10
Returns:
Formatted list of matching meetings with date, attendees, summary, and action items.
Returns "No matching meetings found" if empty.get_person_history
Returns the complete interaction history with a specific person — every meeting, every topic, every commitment, in chronological order.
Arguments:
name: str # Person's name (partial match supported)
Returns:
Chronological timeline of all meetings with this person:
- Meeting date, title, topics discussed
- Commitments made (by you and by them)
- Action item status (open / closed / how many days outstanding)get_open_action_items
Lists every open action item across all past meetings, with owner, meeting context, and how long it has been outstanding.
Arguments: none
Returns:
Sorted list of open action items:
- Task description
- Owner (if detected from notes)
- Source meeting title and date
- Days since the meeting
Returns "No open action items" if all tasks are complete.Usage Flows
Morning briefing
"Give me a morning brief for all my meetings today."brief-mcp calls brief_all_today() — reads your calendar, researches every attendee in parallel (each person once, even across overlapping meetings), and returns one formatted card per meeting. Typical time for a 5-meeting day with 12 unique attendees: under 8 seconds.
Before a specific meeting
"Brief me for the Q4 review with PartnerCo at 2pm."Use brief_with_history for recurring meetings — it adds a full history section showing everything said and committed in prior sessions with those same people.
After a meeting
"Debrief the Q4 review. Notes: discussed roadmap integration,
Bob will send technical spec by Oct 20, Carol to set up infra call.
Outcomes: agreed on Phase 2 timeline."brief-mcp:
Saves the meeting record to
~/.brief-mcp/memory.dbExtracts action items: Bob → send technical spec by Oct 20, Carol → set up infra call
Drafts a follow-up email with the agreed outcomes and next steps
Next time you meet Bob or Carol,
brief_with_historywill surface this record
Sales meeting with CRM context
"Enrich the brief for my Salesforce call with deal context from HubSpot."enrich_brief_with_crm adds a CRM section showing the deal name, stage, amount, and last activity date for every attendee found in HubSpot — giving you the commercial picture alongside the personal one.
Ad-hoc person research
"Who is Priya Mehta from Infosys?"research_attendee("Priya Mehta", "Infosys") — runs in under 3 seconds, cached for 60 minutes.
Checking outstanding commitments
"What's still open from my meetings this week?"get_open_action_items() scans the memory database and returns every unresolved task with owner, source meeting, and how long it has been outstanding.
Architecture
brief-mcp/
├── server.py FastMCP server — registers all 13 tools
├── models.py Pydantic v2 models (Meeting, PersonProfile, MeetingBrief)
├── cache.py TTL cache — 60 min / 256 entries, dual-indexed
├── memory.py SQLite + FTS5 meeting memory database
│
├── integrations/
│ ├── google_calendar.py Google Calendar OAuth2 client
│ ├── outlook_calendar.py Microsoft Graph MSAL client + timezone resolution
│ ├── web_search.py Brave Search + DuckDuckGo fallback (3 parallel queries)
│ ├── hubspot.py HubSpot CRM REST client
│ └── gmail.py Optional Gmail prior-email context
│
└── tools/
├── _shared.py Shared helpers (_find_meeting, _research_attendee_with_cache)
├── calendar_tool.py get_upcoming_meetings
├── research_tool.py research_attendee
├── brief_tool.py get_meeting_brief + brief_all_today + helpers
├── outlook_tool.py get_outlook_meetings + get_outlook_brief
├── crm_tool.py get_crm_context + enrich_brief_with_crm
└── debrief_tool.py debrief_meeting + memory tools (5 tools)Key design decisions
Parallel async research. asyncio.gather fires all attendee lookups simultaneously. A meeting with 6 attendees takes the same wall-clock time as a meeting with 1. brief_all_today deduplicates across meetings first, then fires a single gather across all unique attendees for the day.
Dual-indexed TTL cache. Profiles are stored under both name+company and name-only keys. When the calendar fires lookups without company context (the common case), it still hits profiles stored by the user with explicit company. 60-minute TTL, 256-entry LRU.
Timezone-correct datetimes. Google Calendar returns ISO 8601 strings (timezone-aware). Microsoft Graph returns naive strings with a separate timeZone field (which may be an IANA name or a Windows display name). brief-mcp resolves both via zoneinfo.ZoneInfo and a built-in Windows→IANA mapping. All internal datetimes are timezone.utc-aware.
FTS5 full-text search. Meeting memory uses SQLite's built-in FTS5 extension — no external search dependency. The UPDATE trigger is implemented as DELETE + INSERT (FTS5 does not support UPDATE statements). Search covers title, attendees, summary, action items, and outcomes simultaneously.
Per-item action tracking. mark_action_done supports both item-level completion (stores completed item text in a JSON column) and meeting-level closure (follow_up_sent). get_open_action_items filters out completed items per meeting.
Graceful degradation everywhere. Every integration checks for its required env var at call time. Missing credentials return a clear setup message — the server never crashes, and unconfigured integrations don't affect configured ones.
Privacy
All processing is local. Your meetings, notes, and history never leave your machine.
Data | Where it goes |
Calendar events | Fetched directly from Google / Microsoft via your personal OAuth token. Never touches any brief-mcp server. |
Attendee research | Name + company sent to Brave Search or DuckDuckGo. No meeting context, no email addresses, no calendar data. |
Meeting memory | Stored in |
HubSpot data | Fetched directly from HubSpot using your private app token. |
OAuth tokens | Stored at |
No telemetry. No analytics. No cloud sync. No accounts.
Contributing
Pull requests are welcome. Please open an issue to discuss significant changes before starting.
Development setup
git clone https://github.com/MLDreamer/brief-mcp
cd brief-mcp
uv sync --devRunning tests
All 123 tests run offline — no credentials required.
uv run pytest # full suite
uv run pytest tests/test_memory.py # specific module
uv run pytest -v --tb=short # verbose outputLinting
uv run ruff check src/ tests/
uv run ruff format src/ tests/Test coverage
Module | Tests | Coverage |
| 22 | SQLite CRUD, FTS5 search, person history, per-item action tracking |
| 11 | Contact search, deal fetch, no-key degradation, 401 handling |
| 11 | Timezone resolution, Teams URL, all-day events, pagination |
| 23 | All 5 debrief tools, action item extraction, memory integration |
| 8 | CRM tools, no-key paths, brief enrichment |
| 15 | Dual-index lookup, configure, invalidate, stats |
| 33 | Brief generation, deduplication, timezone-awareness, error paths |
Roadmap
Shipped
Google Calendar — OAuth2, full pagination, Meet/Zoom/Teams URL extraction
Microsoft 365 / Outlook — MSAL device-code, Windows timezone mapping, pagination
Web research — Brave Search + DuckDuckGo fallback, 3 parallel queries per person
Parallel async research with
asyncio.gather+ TTL cacheHubSpot CRM — contact search, deal pipeline, lifecycle stage
brief_all_todaywith cross-meeting attendee deduplicationPost-meeting debrief — action item extraction, follow-up email draft
SQLite FTS5 meeting memory — search, person history, action item tracking
brief_with_history— pre-meeting brief + full past interaction contextOptional Gmail prior-email context enrichment
123 tests (all offline, all passing)
Planned
Salesforce CRM connector
Slack — post brief or debrief to a channel
LinkedIn data via official API (when available)
Automatic follow-up email sending (Gmail / Outlook)
Voice brief via text-to-speech
Team shared memory (multi-user SQLite / shared drive)
Apollo.io / People Data Labs for enriched professional profiles
Star History
Similar Projects
blender-mcp — AI controls Blender 3D
codebase-memory-mcp — AI-powered code intelligence
License
MIT — see LICENSE.
Built on FastMCP and the Model Context Protocol.
If brief-mcp saves you time before a meeting, consider starring the repo — it helps others find it.
Available Tools
13 toolsbrief_all_todayBrief All TodayA
Generate meeting briefs for ALL of today's meetings.
Fetches today's calendar, then researches all attendees across all meetings in parallel (deduplicated — each person only researched once even if they appear in multiple meetings). Perfect for morning prep.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the behavioral burden and does disclose meaningful execution semantics: it fetches today's calendar and researches attendees in parallel with deduplication, which signals cost/scope behavior an agent should anticipate. It does not say whether anything is persisted or what happens on a day with no meetings, leaving a modest gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the scope constraint, and the mechanism (parallel, deduplicated research) is compressed into a parenthetical rather than explicated. Nothing is wasted and nothing essential is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is zero-parameter and has an output schema, so return values need not be described. Scope, execution behavior, and intended use are all covered, leaving nothing an agent needs in order to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters and the schema has 100% coverage with additionalProperties=false, so there is nothing for the description to disambiguate. Baseline 4 applies; no parameter claims are made that could mislead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (Generate) and resource (meeting briefs) with an explicit scope qualifier (ALL of today's meetings), which implicitly separates it from single-meeting siblings like get_meeting_brief and history-oriented ones like brief_with_history. It stops short of naming any sibling explicitly, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Perfect for morning prep" gives a use-case context, but there is no when-not guidance and no comparison against the many nearby alternatives (brief_with_history, get_outlook_brief, get_meeting_brief). The agent can infer the intended scenario but must guess about the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brief_with_historyBrief With HistoryA
Generate a pre-meeting brief that includes past interaction history.
Combines:
Live calendar lookup + parallel attendee web research (like get_meeting_brief)
Past meeting history for each attendee (from your memory DB)
Previous action items and commitments involving these people
This gives a richer "full context" brief — especially valuable for recurring meetings and follow-up calls.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | No | Exact meeting ID from get_upcoming_meetings (takes priority). | |
| meeting_title | No | Partial or full meeting title (Google Calendar). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the internal pipeline: live calendar lookup, parallel attendee web research, memory-DB history, and prior action items. It hints at latency (parallel research) and data sources, though it does not state read-only status, permissions, or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first sentence, then uses a numbered breakdown that maps cleanly to its three internal stages. Slightly verbose in the closing sentence, but every part is informative and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and both parameters are covered by the schema. The description adequately conveys what the tool aggregates; only the operational caveats (latency, permissions) are absent, which is a minor gap for a read-style brief generator.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents meeting_id (with priority note) and meeting_title. The description adds no parameter guidance of its own, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Generate) and resource (pre-meeting brief including past interaction history), then explicitly distinguishes itself from the sibling get_meeting_brief by framing itself as the richer superset. An agent can tell exactly what it produces versus the plain brief.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use condition — 'especially valuable for recurring meetings and follow-up calls' — and references get_meeting_brief as the lighter alternative it builds on. It stops short of an explicit when-not rule (e.g. 'use get_meeting_brief when no history is needed'), so it is strong but not complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debrief_meetingDebrief MeetingA
Record what happened in a meeting and generate follow-up materials.
Provide:
meeting_title: Matches a recent meeting on your calendar (or just the meeting name).
notes: Your raw meeting notes (bullet points, transcript snippet, anything).
action_items: Comma-separated list of tasks and owners (optional — will be auto-extracted from notes if not provided).
outcomes: What was decided/agreed (optional — comma-separated).
Returns:
Structured meeting record saved to memory
Draft follow-up email
Action item list with owners
Next-step suggestions
| Name | Required | Description | Default |
|---|---|---|---|
| notes | Yes | ||
| outcomes | No | ||
| action_items | No | ||
| meeting_title | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden — and it does disclose real behavioral traits: the record is persisted ('saved to memory'), a follow-up email draft is generated, and action items are auto-extracted from notes if omitted. It does not cover failure modes (e.g., meeting_title not matching a calendar event), idempotency, or whether re-running overwrites an existing record.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by clearly labeled Provide/Returns sections; each bullet carries information. The Returns block partly duplicates the output schema, which is minor redundancy rather than noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so explaining return values is not strictly required, but the description's disclosure of the memory-write side effect is valuable. The remaining gap is edge-case behavior when the meeting title does not resolve to a calendar event, and any permissions/calendar-scope requirements, for a tool with zero annotation coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely, and it does: every one of the 4 parameters is explained with format and intent (comma-separated task/owner lists, raw notes accepting bullets or transcript snippets, title matching a calendar meeting or just a name). Optional vs required is also made explicit, which the bare schema only conveys via the required array.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Record what happened in a meeting') plus a secondary capability (generate follow-up materials). This is the only write/record tool among siblings that are all retrieval or preparation tools (get_meeting_brief, search_meeting_history, etc.), so an agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (after a meeting, to capture notes) and clarifies optionality of action_items/outcomes, but it never explicitly states when to use this versus siblings, nor any preconditions beyond the parenthetical about calendar matching. Usage is inferable but not routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enrich_brief_with_crmEnrich Brief With CrmA
Generate a meeting brief enriched with HubSpot CRM data.
Combines Google Calendar lookup + parallel web research on attendees + HubSpot CRM deal context for each attendee. Best used for sales meetings, partner reviews, and customer calls where CRM context matters.
Set HUBSPOT_API_KEY in .env to unlock CRM enrichment.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_title | Yes | Partial or full meeting title to look up on Google Calendar. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose a real behavioral trait: the HUBSPOT_API_KEY environment prerequisite and the implication that CRM enrichment is unavailable without it. It also reveals the tool fans out into parallel web research, hinting at latency/cost, but says nothing about rate limits, partial-failure behavior, or the degraded output shape when the key is absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each earning its place: purpose, composition, usage, and prerequisite. The core purpose is front-loaded in the first sentence with zero preamble or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers composition, intended use, and the auth prerequisite. The remaining gap is behavioral: it never clarifies what the brief looks like without the CRM key or how slow the parallel research step is, which matters for a tool that chains three sources.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single parameter, so the schema already explains that meeting_title is a partial-or-full Calendar lookup string. The description adds no additional matching semantics (e.g., case sensitivity, ambiguity handling), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate a meeting brief enriched with HubSpot CRM data') and then enumerates the three data sources it composes (Calendar lookup, parallel web research, HubSpot deal context). That composition detail is what lets an agent separate this from siblings like brief_with_history or get_meeting_brief without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use signal ('sales meetings, partner reviews, and customer calls where CRM context matters') and a prerequisite (HUBSPOT_API_KEY). It does not name an alternative tool or state when NOT to use this one, so it stops short of the explicit routing that a 5 requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_crm_contextGet Crm ContextB
Look up a person in HubSpot CRM.
Returns deal stage, last contact date, lifecycle stage, associated deals, and interaction notes for the given person.
Set HUBSPOT_API_KEY in .env to enable CRM integration.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Full name of the person to look up (required). | |
| No | Email address for a more precise match (optional but recommended). | ||
| company | No | Company name to narrow the search (optional). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does add real behavioral context by listing the returned fields and disclosing the HUBSPOT_API_KEY/.env configuration requirement, which tells the agent the integration may be disabled. It still omits what happens when the key is missing, whether the call is read-only, and any rate or lookup-miss behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded blocks: the action first, then the payload, then the setup caveat. No filler sentences, though the setup note could have been folded into the first line for even tighter structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description is not obligated to explain return values, and it still summarizes them usefully. The auth prerequisite is surfaced, leaving only sibling-routing guidance as a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter is documented in the schema, so the baseline is 3. The description adds no parameter-level detail (matching semantics, whether name alone is sufficient, how company narrows results) beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Look up a person in HubSpot CRM') and enumerates the returned data fields, which makes the tool's scope unambiguous. It does not, however, distinguish itself from the sibling 'enrich_brief_with_crm' or 'get_person_history', which an agent could reasonably confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to reach for this tool versus the many adjacent siblings (enrich_brief_with_crm, get_person_history, research_attendee). No prerequisites, triggers, or exclusions are given beyond the setup note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meeting_briefGet Meeting BriefA
Generate a full pre-meeting intelligence brief for a single meeting.
Looks up the meeting from your Google Calendar, researches all attendees in parallel, and returns a formatted brief card with:
Attendee profiles (role, company, recent news)
Suggested talking points
Watch-outs and sensitivities
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | No | Exact meeting ID from get_upcoming_meetings (takes priority). | |
| hours_ahead | No | How far ahead to look for the meeting (default: 24h). | |
| meeting_title | No | Partial or full meeting title to look up. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavior: it looks up a specific calendar, fans out attendee research in parallel, and composes a brief card. It omits latency/cost expectations (parallel research implies a slow, expensive call) and any calendar-permission requirements, but the read-only, non-mutating character is clear from 'generate'/'look up'/'researches'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose, then mechanism, then a tight bulleted list of what the brief contains. Efficient overall, though the output bullets partially duplicate a return shape that an output schema already covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter read tool with 100% schema coverage and an output schema, the description supplies the missing high-level picture: what is researched, in what manner, and what the resulting brief looks like. The main remaining hole is selection guidance among the many overlapping brief/meeting siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents meeting_id, hours_ahead, and meeting_title, including the priority rule for meeting_id. The description adds nothing about any of the three parameters, so it sits at the baseline rather than compensating.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate a full pre-meeting intelligence brief for a single meeting') and the single-meeting scope implicitly separates it from brief_all_today. However, no sibling is named, so it is not self-evidently distinct from the near-identical brief_with_history in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Pre-meeting' implies the timing context, and naming Google Calendar as the source implies the Outlook siblings (get_outlook_brief) are the alternative for other calendars. But there is no explicit when-to-use, no when-not, and no routing against brief_with_history or brief_all_today, which overlap heavily with this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_open_action_itemsGet Open Action ItemsA
List all open action items from past meetings.
Shows task, owner, meeting context, and how long it has been open. An action item is considered open if the meeting's follow-up has not been marked done.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses useful behavior: what fields are returned (task, owner, meeting context, age-open) and the criterion that makes an item 'open'. It does not say whether results span all meetings indefinitely, whether there is a time window or pagination limit, or what distinguishes an empty result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and followed by return contents and the definition of 'open'. Every sentence adds information; nothing is wasted or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required, and the zero-parameter read-only nature keeps the surface small. The description covers scope and content adequately, though it omits the time window over which 'past meetings' are scanned and the ordering of results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema imposes nothing to document and the baseline is 4. The description adds no parameter information because none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('open action items from past meetings'), and defines what 'open' means, so the agent knows exactly what comes back. It does not name or contrast any sibling tool, but no sibling overlaps this function, so the purpose is still unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — call this to surface outstanding tasks from prior meetings — and the definition of 'open' (follow-up not marked done) is genuinely useful context. However, there is no explicit when/when-not guidance and no routing to alternatives like search_meeting_history or debrief_meeting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_outlook_briefGet Outlook BriefA
Generate a meeting brief from your Outlook/Microsoft 365 calendar.
Same behaviour as get_meeting_brief but reads from Microsoft 365 instead of Google Calendar. Requires AZURE_CLIENT_ID to be set in .env.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | No | Exact Graph API event ID (takes priority over title). | |
| hours_ahead | No | How far ahead to look for the meeting (default: 24h). | |
| meeting_title | No | Partial or full Outlook meeting title to match. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the setup prerequisite (AZURE_CLIENT_ID must be set in .env), which is real operational context, but says nothing about read-only nature, latency, or failure behavior when the credential is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and scope, then the sibling comparison and prerequisite. Every sentence earns its place with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and all three params are documented in the schema. The description covers purpose, sibling routing, and the credential prerequisite; only richer behavioral detail (e.g., what happens without AZURE_CLIENT_ID) is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so meeting_id, hours_ahead, and meeting_title are already fully documented, giving a baseline of 3. The description adds no parameter-level meaning (e.g., priority between meeting_id and meeting_title) beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Generate) and resource (a meeting brief) plus the data source (Outlook/Microsoft 365 calendar). It also explicitly distinguishes itself from the sibling get_meeting_brief by naming the differing backend (Google Calendar vs Microsoft 365).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Points the agent at the alternative (get_meeting_brief) and gives the selecting condition (Microsoft 365 vs Google Calendar) plus a prerequisite (AZURE_CLIENT_ID in .env). It stops short of an explicit when-not statement, but the routing condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_outlook_meetingsGet Outlook MeetingsA
Get upcoming meetings from Outlook/Microsoft 365 calendar.
Configure AZURE_CLIENT_ID in .env to enable. On first run, a device-code authentication prompt will appear in the terminal — visit the URL shown and enter the code to authorise access.
Returns the same format as get_upcoming_meetings (Google Calendar).
| Name | Required | Description | Default |
|---|---|---|---|
| hours_ahead | No | How far ahead to look in hours (default: 24). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavioral context: it requires AZURE_CLIENT_ID configuration to be enabled and triggers a first-run device-code auth flow. What it omits is the read-only safety profile and any error/empty-calendar behavior, but the auth onboarding disclosure is substantive beyond a bare verb.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with the core action, followed by the setup prerequisite and the return-format reference. Every sentence is relevant, though the auth paragraph is slightly more operational detail than selection guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description needn't explain return values, and the one optional parameter is fully covered by the schema. The auth prerequisite is surfaced, leaving only minor gaps around read-only semantics and failure modes for a tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so hours_ahead and its 24-hour default are already fully documented in the schema. The description adds no supplementary syntax or boundary detail beyond that, which is the expected baseline when structured data does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get upcoming meetings from Outlook/Microsoft 365 calendar) and disambiguates the data source from the Google variant by naming get_upcoming_meetings as the format reference. An agent can tell which calendar backend this targets, though it doesn't explicitly say it is the Outlook counterpart to use instead of the Google tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The source qualifier (Outlook/Microsoft 365) implies when this tool is appropriate versus get_upcoming_meetings, and the AZURE_CLIENT_ID line implies a precondition. However, there is no explicit when-to-use/when-not statement nor a direct routing sentence pointing to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_person_historyGet Person HistoryB
Get the full interaction history with a specific person.
Shows all past meetings with this person, topics discussed, commitments made, and outcomes.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Full or partial name of the person to look up. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden, and it does disclose the categories of content returned (past meetings, topics, commitments, outcomes). However, it says nothing about permissions, result size/limits, pagination, or whether history is scoped to a workspace, leaving real behavioral gaps for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and followed by the enumerated content. No filler, no restating of the title, and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with a full output schema, the description adequately frames what the tool returns and why. The absence of annotations means some behavioral detail (limits, scoping) is arguably missing, but the core need is well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single 'name' parameter already documented as 'Full or partial name of the person to look up.' The description mentions 'a specific person' but adds no syntax, matching behavior, or ambiguity handling beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and a well-defined resource ('full interaction history with a specific person'), and the second sentence enumerates the content (meetings, topics, commitments, outcomes). It never distinguishes itself from close siblings like research_attendee or search_meeting_history, so an agent cannot disambiguate from this text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives. Siblings such as research_attendee, search_meeting_history, and brief_with_history plausibly overlap, yet the description offers no boundary conditions, prerequisites, or exclusions to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upcoming_meetingsGet Upcoming MeetingsA
Get upcoming meetings from Google Calendar for the next N hours.
Returns a list of meeting objects with:
id, title, start_time, end_time (ISO format)
attendees (name + email)
meeting_url (Google Meet / Zoom / Teams link if present)
location, description
| Name | Required | Description | Default |
|---|---|---|---|
| hours_ahead | No | How many hours into the future to look (default: 24). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the data source and the forward-looking window, which is useful, but says nothing about whose calendar is read, auth requirements, timezone basis, or empty-result behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in one tight sentence. The follow-on return-field list is slightly redundant given an output schema exists, but it is compact and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with one optional parameter and an existing output schema, the description covers purpose and scope adequately. Only timezone/auth context is absent, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional hours_ahead parameter is documented with its default in the schema. The description only restates 'next N hours' and adds no format or boundary detail beyond that baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get), resource (upcoming meetings), and source (Google Calendar) with an explicit time scope (next N hours). This cleanly separates it from the sibling get_outlook_meetings, which covers a different provider.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'from Google Calendar' qualifier implicitly routes the agent away from get_outlook_meetings, but there is no explicit when-to-use statement, no mention of when to prefer search_meeting_history or get_meeting_brief, and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
research_attendeeResearch AttendeeB
Research a meeting attendee: current role, company news, and background.
Results are cached for 60 minutes — repeated calls for the same person return instantly without new API requests.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Full name of the person to research (required). | |
| company | No | Their company or organization (improves accuracy). | |
| context | No | Any additional context you know about them (optional). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full behavioral burden, and it does add one genuinely useful trait: a 60-minute cache that makes repeat calls free of new API requests — a real cost/latency signal an agent can plan around. It omits the rest of the profile though: that this hits an external enrichment API, what happens for an unknown or ambiguous person, whether it fails soft or hard, and whether there is any cost or rate limit on the first call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler. The purpose leads, and the caching caveat follows as supporting operational detail rather than burying the lede.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% schema coverage and an output schema present, the description needn't explain parameters or return values, and it supplies purpose plus a caching trait. What keeps it from a 5 is the absence of any routing signal among the many overlapping sibling research/enrichment tools, which is the main thing an agent could still get wrong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in structured form, and the description adds nothing above that baseline. It never mentions that 'company' and 'context' improve accuracy — a meaningful hint that lives only in the schema, not the description. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb ('Research') plus a specific resource ('a meeting attendee') and an enumeration of what the research returns: current role, company news, background. This is far more than a restatement of the name. It doesn't, however, distinguish itself from the closely related siblings get_person_history and get_crm_context, whose scopes overlap enough that an agent could plausibly reach for the wrong one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No sentence says when to call this instead of get_person_history or enrich_brief_with_crm, or what the prerequisites are (does it need an existing meeting? an email address?). The only usage-adjacent content is the caching note, which tells the agent re-calling is cheap but not when calling is appropriate at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_meeting_historySearch Meeting HistoryA
Search your past meeting history.
Query by person name, company name, topic, decision, or date. Uses full-text search (FTS5) across meeting titles, attendees, summaries, action items, and outcomes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of meetings to return (default: 10). | |
| query | Yes | Search term (name, topic, company, or keyword). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the full burden, and it does add meaningful mechanism context (FTS5 full-text search) and lists the indexed surface (titles, attendees, summaries, action items, outcomes). It stops short of disclosing pagination/limit behavior or how relevance/ranking works, so it is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the core action before elaborating on fields and mechanism. Efficient with little waste, though the FTS5 implementation detail is arguably more developer-facing than agent-facing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter search tool with a full output schema, the description covers purpose, queryable fields, and search mechanism. The one gap is sibling differentiation against get_person_history, whose name overlaps heavily with this tool's purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented by the schema; baseline is 3. The 'Query by person name, company name, topic, decision, or date' line adds slight meaning to the query parameter but no syntax or format guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource ('Search your past meeting history') and enumerates the fields that can be queried. However, it does not distinguish itself from sibling get_person_history, which also seems to retrieve past interactions with a person, leaving the agent to guess which to call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The examples of queryable dimensions (person, company, topic, decision, date) imply usage context, but there is no explicit when-to-use/when-not and no mention of alternatives like get_person_history or research_attendee when the target is a specific person.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.4.0- First observed
brief_all_today - First observed
brief_with_history - First observed
debrief_meeting - First observed
enrich_brief_with_crm - First observed
get_crm_context - First observed
get_meeting_brief - First observed
get_open_action_items - First observed
get_outlook_brief - First observed
get_outlook_meetings - First observed
get_person_history - First observed
get_upcoming_meetings - First observed
research_attendee - First observed
search_meeting_history
TDQS
Scored across 13 tools
Five tools all generate a 'brief' (get_meeting_brief, brief_with_history, brief_all_today, get_outlook_brief, enrich_brief_with_crm), and brief_with_history is explicitly a superset of get_meeting_brief. Descriptions do differentiate the data sources (Google vs Outlook vs CRM vs history), but an agent must read carefully to pick the right variant.
Mostly snake_case verb_noun (get_upcoming_meetings, research_attendee, search_meeting_history), but the 'brief' family is inconsistent: brief_with_history, brief_all_today, get_meeting_brief, get_outlook_brief, enrich_brief_with_crm mix 'brief' as verb, noun, and modifier.
13 tools is well-scoped for a meeting-intelligence server, and each tool covers a distinct capability (calendar fetch, research, search, brief, CRM, debrief).
Core read/brief/debrief flows are covered, but the action-item lifecycle is incomplete: get_open_action_items lists items yet no tool marks a follow-up done or closes an item, and there is no way to create or update meetings.
Maintenance
Related MCP Connectors
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables AI agents to join and interact with online meetings (Zoom and Google Meet), capturing transcripts and recordings to generate meeting summaries.310MIT
- FlicenseNot gradedqualityDmaintenanceA locally-hosted MCP server that integrates Gmail, Google Calendar, and Google Drive to provide AI-powered management of emails, events, and files. It enables tool-based interactions like sending emails, creating calendar events, and searching Drive files through clients like Cursor and Claude Desktop.-
- AlicenseNot gradedqualityDmaintenanceMCP server that exposes local Granola meeting notes, summaries, and transcripts to AI assistants via SQLite-backed search and retrieval.MIT
- AlicenseNot gradedqualityBmaintenanceMCP-native sales intelligence server enabling prospect enrichment, LinkedIn scraping, and CRM push to HubSpot/Salesforce via natural language.6 npmMozilla Public 2.0