Skip to main content
Glama

brief-mcp

Know everyone in the room before you walk in.

PyPI version Python 3.11+ License: MIT MCP Compatible Tests CI Glama

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 tracking

Dual-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.gather fires all attendee lookups simultaneously; a 6-person meeting takes the same wall-clock time as a 1-person meeting

  • Timezone-correct everywhere — Microsoft Graph timezone strings resolved via ZoneInfo IANA and Windows→IANA mapping; all datetimes are timezone-aware throughout

  • TTL 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

uvx brief-mcp

uvx runs brief-mcp in an isolated environment without a permanent install. Requires uv.

pip

pip install brief-mcp

From source

git clone https://github.com/MLDreamer/brief-mcp
cd brief-mcp
uv sync
uv run brief-mcp

Quick 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 accounts

Azure Portal setup (one-time, 3 minutes):

  1. Azure Portal → App registrations → New registration

  2. Supported account types: Accounts in any organizational directory and personal Microsoft accounts

  3. Redirect URI → Platform: Mobile and desktop → https://login.microsoftonline.com/common/oauth2/nativeclient

  4. API Permissions → Microsoft Graph → Delegated → add Calendars.Read + offline_access → Grant admin consent

  5. Copy 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: ABCD1234

After 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):

  1. HubSpot → Settings → Integrations → Private Apps → Create a private app

  2. Scopes: crm.objects.contacts.read + crm.objects.deals.read

  3. Generate 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_link

research_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.db

  • Extracts 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_history will 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 ~/.brief-mcp/memory.db on your local machine. Never synced anywhere.

HubSpot data

Fetched directly from HubSpot using your private app token.

OAuth tokens

Stored at ~/.brief-mcp/token.json and ~/.brief-mcp/ms_token.json. Read-only scopes only.

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 --dev

Running 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 output

Linting

uv run ruff check src/ tests/
uv run ruff format src/ tests/

Test coverage

Module

Tests

Coverage

memory.py

22

SQLite CRUD, FTS5 search, person history, per-item action tracking

integrations/hubspot.py

11

Contact search, deal fetch, no-key degradation, 401 handling

integrations/outlook_calendar.py

11

Timezone resolution, Teams URL, all-day events, pagination

tools/debrief_tool.py

23

All 5 debrief tools, action item extraction, memory integration

tools/crm_tool.py

8

CRM tools, no-key paths, brief enrichment

cache.py

15

Dual-index lookup, configure, invalidate, stats

tools/ (core)

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 cache

  • HubSpot CRM — contact search, deal pipeline, lifecycle stage

  • brief_all_today with cross-meeting attendee deduplication

  • Post-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 context

  • Optional 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

Star History Chart


Similar Projects


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 tools
brief_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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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:

  1. Live calendar lookup + parallel attendee web research (like get_meeting_brief)

  2. Past meeting history for each attendee (from your memory DB)

  3. Previous action items and commitments involving these people

This gives a richer "full context" brief — especially valuable for recurring meetings and follow-up calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
meeting_idNoExact meeting ID from get_upcoming_meetings (takes priority).
meeting_titleNoPartial or full meeting title (Google Calendar).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
notesYes
outcomesNo
action_itemsNo
meeting_titleYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
meeting_titleYesPartial or full meeting title to look up on Google Calendar.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFull name of the person to look up (required).
emailNoEmail address for a more precise match (optional but recommended).
companyNoCompany name to narrow the search (optional).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
meeting_idNoExact meeting ID from get_upcoming_meetings (takes priority).
hours_aheadNoHow far ahead to look for the meeting (default: 24h).
meeting_titleNoPartial or full meeting title to look up.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
meeting_idNoExact Graph API event ID (takes priority over title).
hours_aheadNoHow far ahead to look for the meeting (default: 24h).
meeting_titleNoPartial or full Outlook meeting title to match.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
hours_aheadNoHow far ahead to look in hours (default: 24).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFull or partial name of the person to look up.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
hours_aheadNoHow many hours into the future to look (default: 24).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFull name of the person to research (required).
companyNoTheir company or organization (improves accuracy).
contextNoAny additional context you know about them (optional).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of meetings to return (default: 10).
queryYesSearch term (name, topic, company, or keyword).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 13 tool updatesv0.4.0
    • First observedbrief_all_today
    • First observedbrief_with_history
    • First observeddebrief_meeting
    • First observedenrich_brief_with_crm
    • First observedget_crm_context
    • First observedget_meeting_brief
    • First observedget_open_action_items
    • First observedget_outlook_brief
    • First observedget_outlook_meetings
    • First observedget_person_history
    • First observedget_upcoming_meetings
    • First observedresearch_attendee
    • First observedsearch_meeting_history

TDQS

A3.6/5.0

Scored across 13 tools

Disambiguation3/5

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.

Naming Consistency3/5

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.

Tool Count5/5

13 tools is well-scoped for a meeting-intelligence server, and each tool covers a distinct capability (calendar fetch, research, search, brief, CRM, debrief).

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

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

  • A
    license
    B
    quality
    D
    maintenance
    A 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.
    3
    10
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP-native sales intelligence server enabling prospect enrichment, LinkedIn scraping, and CRM push to HubSpot/Salesforce via natural language.
    6 npm
    Mozilla Public 2.0