Meetings shouldn't end with forgotten action items. They should end with execution.
CloseLoop AI is an MCP-powered autonomous meeting execution platform that transforms meeting conversations into real work.
Most meeting assistants stop at notes. CloseLoop AI continues after the meeting: it detects decisions, finds the owner, creates the task, sets a deadline, monitors progress, follows up automatically, escalates overdue work, and generates a weekly report — with zero manual handoff between "we decided X" and "it's tracked, assigned, and chased."
Meeting → Transcript → Decision Extraction → Owner Detection → Jira Ticket
→ Calendar Deadline → GitHub PR Tracking → Follow-up → Escalation
→ Weekly Report → Executive Dashboard
Built on NitroStack. Every integration below hits a real external API when credentials are configured — nothing fabricates a fake ticket ID, message timestamp, or event link.
Every organization spends hundreds of hours in meetings.
Yet after every meeting, someone still has to:
- remember action items
- create Jira tickets
- assign owners
- schedule deadlines
- send Slack follow-ups
- update project boards
- prepare weekly reports
These repetitive tasks are manual, error-prone, and often forgotten.
Meeting assistants today summarize conversations.
But summaries don't execute work.
CloseLoop AI closes the gap between decision and execution.
Instead of generating another meeting summary, it transforms conversations into live project management workflows.
The platform automatically:
- detects decisions
- identifies task owners
- extracts deadlines
- prioritizes work
- creates Jira issues
- schedules Calendar events
- notifies teams in Slack
- tracks GitHub progress
- escalates overdue work
- generates executive reports
Everything happens through MCP tools, allowing any compatible AI client to orchestrate the workflow.
| Module | Primitives | What it does |
|---|---|---|
meeting-ingest |
Tool: import_meeting. Resources: meeting_transcript, meeting_metadata, participant_roster |
Ingests a meeting (Zoom/Teams/Meet/Slack Huddles/MP4) |
decision-extraction |
Tool: extract_decisions. Resources: decision_log, extracted_actions. Prompts: extract_decisions_v1, owner_detection_v1, deadline_extraction_v1 |
Gemini-based structured extraction of decisions/owners/deadlines/confidence, with a heuristic fallback if no API key is set |
jira-server |
Tools: create_jira_ticket, update_jira_ticket, fetch_jira_status, close_jira_ticket. Resource: jira_task_board |
Real Jira Cloud REST v3. Enforces the confidence gate (< 80% blocks ticket creation) |
calendar-server |
Tools: create_calendar_event, create_deadline_event, create_reminder. Resource: upcoming_deadlines |
Real Google Calendar invites via a service account |
slack-server |
Tools: send_followup, send_manager_escalation, send_approval_request. Resource: notification_history |
Real Slack messages (chat.postMessage) |
github-server |
Tools: create_github_issue, fetch_pull_requests, fetch_commits, link_pr_to_decision. Resource: github_activity_board |
Real GitHub REST API — tracks Decision → Issue/PR → Merge |
notion-server |
Tools: publish_report, create_project_page, update_project_status. Resource: published_reports |
Real Notion pages for weekly reports |
analytics-server |
Tool: get_dashboard (widget). Resources: executive_dashboard, analytics_metrics |
Live-aggregated Control Tower metrics, no separate pipeline |
escalation-scanner |
Background service (no MCP surface) | Hourly timer that auto-escalates overdue tasks to Slack, independent of any AI tool call |
Human-in-the-loop confidence gate: any decision extracted with confidence < 80% is not turned into a ticket automatically. create_jira_ticket returns requiresApproval: true instead, and the orchestrating AI is expected to call send_approval_request and wait.
Widgets (NitroChat rich widgets, not plain text): decision-card (on extract_decisions), task-card (on create_jira_ticket), executive-dashboard (on get_dashboard).
{
"mcpServers": {
"closeloop-ai": {
"url": "https://meeting2mission-1-one-piece-amrita-university-amritapuri-campus.app.nitrocloud.ai/"
}
}
}
npm install
cp .env.example .env # fill in the values below
npm run build
npm startMONGODB_URI— a MongoDB Atlas connection string.
GEMINI_API_KEY— real decision extraction (aistudio.google.com/apikey). Without it,extract_decisionsuses a much weaker regex heuristic and logs a warning.JIRA_BASE_URL/JIRA_EMAIL/JIRA_API_TOKEN/JIRA_PROJECT_KEY— real Jira tickets. Without it, tasks are recorded locally with aLOCAL-...id andreal: false.SLACK_BOT_TOKEN/SLACK_DEFAULT_CHANNEL/SLACK_ESCALATION_CHANNEL— real Slack messages. Without it, Slack tools throw (they never fabricate a message id).GOOGLE_SERVICE_ACCOUNT_JSON/GOOGLE_CALENDAR_ID— real Calendar invites. Without it, events are recorded locally only.GITHUB_TOKEN/GITHUB_OWNER/GITHUB_REPO— real issue/PR tracking.NOTION_API_KEY/NOTION_PARENT_PAGE_ID— real published reports.
Every tool tells you in its response (real: true/false + a message) whether it hit the live API or fell back locally, so a judge's run is never silently fake.
CloseLoop stays a single MCP server (not a host) even with real user accounts — a host is the thing that orchestrates calls to MCP servers (NitroStudio/ChatGPT/Claude do that job). Adding login just makes this server multi-tenant: each tool call resolves whose credentials to use.
.envcredentials above are the single-tenant fallback — used whenever no authenticated user (or no user with that integration connected) is making the call. This is what the hackathon judge's NitroStudio session uses, since it never sends a login token.web/is a separate, standalone signup/login + "connect your accounts" app (Express, its ownpackage.json, runs on its own port). It shares the same MongoDB and the sameJWT_SECRET/CREDENTIAL_ENCRYPTION_KEYas the MCP server (seeweb/.env.example).- A signed-up user connects GitHub/Jira/Slack/Google Calendar/Notion via real OAuth (each provider needs its own OAuth app registered on that platform's console —
web/lib/oauth-providers.jsdocuments exactly where). Tokens are encrypted (AES-256-GCM, reversible — never hashed, since hashed tokens can't be replayed to call the provider's API later) and stored per-user in thecredentialscollection. - The user's dashboard (
web/public/dashboard.html) shows a personal JWT to paste into their MCP client asAuthorization: Bearer <token>. When a tool call arrives with that header,OptionalJWTGuard(never blocks — just tries to identify the caller) populatesctx.auth.subject, andcredential-resolver.tsuses that user's connected account instead of.env.
Run it locally:
cd web
npm install
cp .env.example .env # MONGODB_URI/JWT_SECRET/CREDENTIAL_ENCRYPTION_KEY must match the root .env
npm run dev # http://localhost:3010Instead of building a standalone application, CloseLoop exposes every capability through the Model Context Protocol.
This allows any compatible AI client—including NitroStudio, Claude Desktop, Cursor, and ChatGPT—to invoke the same tools. CloseLoop becomes infrastructure rather than another application.
✅ Zoom ✅ Microsoft Teams ✅ Google Meet ✅ Slack ✅ Jira Cloud ✅ GitHub ✅ Google Calendar ✅ Notion ✅ MongoDB ✅ Gemini ✅ NitroStack MCP
CloseLoop reduces the manual work that happens after every meeting.
Instead of spending 15–30 minutes creating tickets, assigning owners, sending reminders, and updating project boards, teams can move directly from discussion to execution.
The platform improves:
- accountability
- execution speed
- project visibility
- deadline adherence
- management reporting
A single conversational chain through NitroStudio (or any MCP client) exercises the whole CORE loop:
- Import a meeting: "Import a meeting titled 'Sprint Planning', platform zoom, participants ['Alex Rivera', 'Sam Okafor'], startTime/endTime today, transcript: '...Alex Rivera will own the payments retry logic and have it done by next Friday. Sam Okafor is investigating the checkout latency spike, high priority...'"
→
import_meetingruns, returns ameetingId. - Extract decisions: "Extract the decisions from that meeting."
→
extract_decisionsruns, the decision-card widget renders with confidence scores per decision. - Create the ticket: "Create a Jira ticket for the payments retry decision."
→ If confidence ≥ 80%,
create_jira_ticketruns and the task-card widget renders with a real Jira link. If confidence < 80%, the agent is told to callsend_approval_requestinstead — demonstrate this path with a deliberately vague transcript. - Schedule the deadline: "Create a calendar deadline event for that task."
→
create_calendar_eventsends a real Google Calendar invite. - Follow up: "Send a Slack follow-up for that meeting to #engineering."
→
send_followupposts a real Slack message. - Show the dashboard: "Show me the dashboard."
→
get_dashboardruns, the executive-dashboard widget renders live counts. - (Escalation, if time allows): manually backdate a task's deadline in Mongo, wait for the hourly scanner or call
send_manager_escalationdirectly — a real escalation appears in the Slack escalation channel. - (Stretch):
link_pr_to_decisionagainst a real PR number in your configured repo, andpublish_reportto generate a real Notion weekly report.
We target enterprise engineering & operations governance — the decision-to-execution gap that costs every org meeting-hours of lost accountability. The demo scenario is a sprint planning / engineering standup because it shows a full, independently verifiable loop: decision → Jira ticket → GitHub PR link → escalation → report.
Original NitroStack template docs: docs.nitrostack.ai · Studio: nitrostack.ai/studio