Vee is V1 at Michigan's internal Slack agent, built with the Eve framework and hosted on Vercel.
Vee responds to Slack mentions and direct messages, keeps durable conversation
state within Slack threads, can use Eve's built-in tools, and connects to the
V1 team's shared Notion workspace, public Slack history, Granola meeting notes,
Google Calendar, and the Vee and website GitHub repositories through MCP. Its
identity and behavior are defined in agent/instructions.md; model selection
lives in agent/agent.ts; and the Slack channel is configured in
agent/channels/slack.ts.
Vee uses openai/gpt-5.6-luna through AI Gateway, with routing restricted to
the OpenAI provider. This bypasses the team's Azure BYOK credential and uses AI
Gateway's Vercel-managed system credentials.
Vee is retrieval-first for factual answers. It must verify claims with at least one relevant source: Notion at minimum for V1 facts, Granola for meetings, Slack for team discussions and recent operational context, GitHub for repository questions, and web search for external facts. It names its sources and states when retrieval cannot verify an answer instead of guessing.
GitHub access is restricted to V1Michigan/vee (Vee's own code) and
V1Michigan/website-v2 (V1 at Michigan's website), including filing issues and
creating changes on vee/* branches for draft pull requests. Vee may suggest
filing self-feedback in V1Michigan/vee; it files website improvement issues
only when explicitly requested. Vee is instructed never to push to main,
merge its own pull requests, alter repository settings, manage secrets, run
workflows, or publish releases. GitHub branch protection is the enforcement
boundary for main.
These capabilities are implemented in the code. Connected services require the shared credentials below; this list is not a claim that every integration is currently authorized or deployed.
- Slack assistant: responds to mentions and direct messages, with conversation context retained within Slack threads.
- Source-backed answers: searches relevant sources, cites or names evidence, and explains when a claim cannot be verified.
- Notion: searches, reads, creates, and updates V1 team documentation.
- Public Slack search: retrieves discussions and decisions from public channels using the designated V1 account. No private-channel or DM search.
- Meeting context: searches Granola notes, summaries, action items, and transcripts accessible to Vee's designated account.
- Team calendar: finds events and availability, suggests meeting times, and can create, update, delete, or respond to events after confirmation of the exact event details. It does not connect each person's private calendar.
- AgentMail: lists Vee's inboxes, reads/searches messages and threads, and creates or edits drafts. Creating inboxes, sending, replying, forwarding, and sending drafts require confirmation under Vee's instructions. AgentMail does not automatically contain V1's existing Gmail or listserv history.
- GitHub: reads the Vee and website repositories, searches/files issues,
prepares changes on
vee/*branches, and opens draft pull requests. Branch and approval rules are agent instructions; repository permissions and branch protection provide enforcement. - AI cost reporting: reports team-wide AI Gateway requests, tokens, Vercel charges, and provider list-price usage for four time windows. This is not a Vee-only bill or a remaining-credit balance.
- Centralized connections: reuses V1 credentials across Slack users, with administrator-only setup commands and no personal OAuth prompts in chat. Missing credentials produce a setup error instead of a sign-in loop.
- AgentMail: shared credential available; a live read-only inbox listing succeeded after administrator consent.
- GitHub: shared app credential available; repository tool access still needs a downstream check.
- Notion, public Slack search, Granola: shared authorization still required.
- Google Calendar: configured in code, but its connector was not found in the linked Vercel project and must be provisioned.
Run pnpm connections:check for current credential status. A browser login to
Notion or AgentMail alone does not authorize Vee; the Vercel Connect consent
flow must complete. Production status depends on deployment and verification.
Proposed priorities based on V1's operating workflows. These are not implemented and are not commitments to release dates. Existing tools can help draft parts of these workflows, but Vee has no dedicated end-to-end automation for them yet.
- Finish shared-service setup: connect the remaining services, verify retrieval from two Slack users, and add connection health reporting.
- Meeting and Slack commitments to Linear: propose tasks with owners, dates, and source links; check for duplicates; create approved tickets in existing projects and cycles. Requires a Linear integration.
- Event readiness checks: compare confirmed event details against the Ship-It runbook, flag missing owners/assets/links, and prepare event copy. Add scoped Luma, Tally, Pitch, and Retool actions after the read-only pilot.
- Onboarding checklists: instantiate existing Notion templates with a buddy, role-specific resources, and Day 1/3/5/7/14 milestones.
- Reimbursement triage: check required fields and receipts, flag possible duplicates, and prepare a private review queue. Approval and payment stay with authorized people.
- Marketing preparation: draft channel-specific copy, validate links and UTM parameters, and check readiness against the existing content calendar. Publishing requires approval and additional integrations.
- Startup Week follow-through: track company owners and next actions, draft outreach, and check deliverables using the existing CRM. Real email history requires verified mailbox routing or an additional connection.
- Opt-in reminders and ops digests: surface overdue commitments and approaching deadlines, with owners, stop conditions, and duplicate prevention. No dedicated scheduled ops workflows are configured today.
- Cost and reliability controls: measure cost per completed workflow, evaluate model quality on real tasks, and route harder requests to a stronger model only when useful. No automatic model routing or per-workflow budget enforcement exists yet.
pnpm install
pnpm devpnpm test
pnpm typecheck
pnpm buildDeploy with Eve after linking the project and provisioning the Slack connector:
vercel link
vercel env pull
pnpm exec eve deployAll MCP connections use centrally managed credentials. Slack users are never asked to connect a personal account. Missing or revoked credentials fail with an administrator setup message; they do not start a consent flow in Slack.
GitHub uses the app installation limited to V1Michigan/vee and website-v2. Notion and AgentMail retain their existing fixed shared OAuth identities. Slack search, Calendar, and Granola now use designated V1 OAuth identities. These remain standard provider OAuth grants, but an administrator provisions them outside chat. This does not turn user-only provider APIs into app APIs.
With the Vee project linked and fresh local Vercel credentials:
pnpm connections:check
pnpm connections:authorize agentmail
pnpm connections:authorize notion
pnpm connections:authorize slack-search
pnpm connections:authorize google-calendar
pnpm connections:authorize granolaEach authorize command prints a short-lived consent link. Complete it using the designated V1 account, then run the check again. The commands never print tokens. An existing shared Notion or AgentMail grant is reused; previous personal Slack, Calendar, and Granola grants are not reused. GitHub app setup is done in Vercel Connect. A successful credential check does not verify downstream tool access. After provisioning, build/deploy and test read-only retrieval in each service from two different Slack users; neither should see a sign-in link.
Only connect accounts whose accessible data can be shared with Vee's users. Provider permissions are the access boundary: restrict Notion pages, Calendar sharing, AgentMail organization membership, and Granola notes accordingly. Slack search requests only search:read.public and requires a designated user OAuth grant; the Slack channel bot credential cannot replace it. Calendar now means V1's team schedule, not each requester's personal schedule. Granola MCP still authenticates a designated account; it is not the Granola workspace API and does not automatically include every member's notes. Leave it unprovisioned until an appropriate team account is available, or use shared notes in Notion.
The Calendar connector must first be provisioned in Vercel Connect with Google's Calendar API and Calendar MCP API enabled. Shared credentials must be installed before deployment to avoid losing access during migration. Confirmation rules for sending mail and modifying events still apply. Requesters retain their Slack identity; sharing credentials does not grant them administrator privileges.
Vee's check_ai_gateway_usage tool uses Vercel's Custom Reporting API to show
team-wide AI Gateway activity for all time, the past 30 days, the past 7 days,
and the past 24 hours. Each period includes request volume, token usage, the
amount charged through Vercel, and market-price usage across both system and
BYOK credentials.
On Vercel, the tool uses the automatically provided VERCEL_OIDC_TOKEN. For
local development, add a team AI Gateway key:
AI_GATEWAY_API_KEY=Custom Reporting currently requires a Pro or Enterprise Vercel team. Reports
can lag by several minutes. The tool caches results for five minutes and makes
two reporting queries when the cache is cold. Set
AI_GATEWAY_USAGE_START_DATE=YYYY-MM-DD only if the default all-time starting
date of 2020-01-01 needs to be changed.