API & MCP Server
Access your IceCubes meetings, transcripts, and action items programmatically via the REST API, or connect Claude, ChatGPT, and other AI tools via the MCP server.
REST API
Query meetings, transcripts, and action items with simple HTTP requests.
MCP Server
Connect Claude Desktop, Claude Code, Cursor, or ChatGPT to your meeting data.
API Keys
Secure authentication with per-user API keys. Create up to 5 keys.
Authentication
All API and MCP requests require an API key. Create one from Settings → Developer.
Include your API key in the Authorization header:
Authorization: Bearer ik_a1b2c3d4_e5f6789012345678901234567890abcdef01234567
API keys start with ik_. The full key is only shown once when created — store it securely. You can revoke keys at any time from the Developer settings.
MCP Server Setup
The IceCubes MCP server lets AI tools like Claude and ChatGPT access your meeting data through the Model Context Protocol.
Claude Desktop
Add this to your claude_desktop_config.json (found at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"icecubes": {
"command": "npx",
"args": [
"mcp-remote",
"https://icecubes-app.fly.dev/api/mcp",
"--header",
"Authorization: Bearer YOUR_API_KEY"
]
}
}
}Restart Claude Desktop after saving. You should see "icecubes" in the MCP tools list.
Claude Code
Add to your project's .mcp.json or global MCP settings:
{
"mcpServers": {
"icecubes": {
"command": "npx",
"args": [
"mcp-remote",
"https://icecubes-app.fly.dev/api/mcp",
"--header",
"Authorization: Bearer YOUR_API_KEY"
]
}
}
}Cursor
Go to Cursor Settings → MCP and add a new server with the same configuration as Claude Desktop above.
ChatGPT
In ChatGPT Settings → Connectors → Create, enter the MCP server URL:
https://icecubes-app.fly.dev/api/mcp
Select Bearer Token authentication and paste your API key.
MCP Tools
The MCP server exposes 13 tools that AI assistants can call:
get_userGet your profile including meeting count and organization info. No parameters required.
get_meetingsSearch and list your meetings with optional filters.
keyword — Search by title
from_date / to_date — Date range (ISO 8601)
participant — Filter by participant email
limit — Max results (default 20, max 50)
get_meetingGet full details of a specific meeting including summary and action items.
meeting_id — Required. The meeting ID.
get_transcriptGet the full transcript with speaker names and timestamps.
meeting_id — Required. The meeting ID.
get_action_itemsList action items across all meetings or for a specific meeting.
meeting_id — Optional. Filter by meeting.
completed — Optional. Filter by completion status.
limit — Max results (default 20, max 50)
search_meetingsSearch across all meeting content by keyword.
query — Required. Search query.
content_type — Filter by content type.
speaker — Filter by speaker name.
limit — Max results.
get_insightsGet sales insights for a meeting.
meeting_id — Required. The meeting ID.
category — Filter by insight category.
create_action_itemCreate an action item for a meeting.
meeting_id — Required. The meeting ID.
text — Required. Action item text.
assignee_email — Optional. Assignee email.
due_date — Optional. Due date (ISO 8601).
update_action_itemUpdate an existing action item.
action_item_id — Required. The action item ID.
completed — Optional. Mark as complete/incomplete.
text — Optional. Updated text.
get_notesGet meeting notes.
meeting_id — Required. The meeting ID.
update_notesUpdate meeting notes.
meeting_id — Required. The meeting ID.
content — Required. The notes content.
get_contactsList contacts from your meetings.
search — Search by name or email.
domain — Filter by email domain.
limit — Max results.
get_tagsList all available tags (organization and personal). No parameters required.
Example Prompts
Once connected, try asking Claude or ChatGPT:
- "What were the key action items from my meetings last week?"
- "Summarize my meeting with [client name]"
- "What competitor mentions came up in recent sales calls?"
- "Show me all open action items assigned to me"
- "What were the main topics discussed in my last 5 meetings?"
REST API
The REST API provides direct HTTP access to your meeting data. Endpoints support both read (GET) and write (POST, PUT, PATCH) operations, and require API key authentication.
Base URL: https://icecubes-app.fly.dev/api/public
GET /api/public/user
Returns your user profile and meeting statistics.
curl https://icecubes-app.fly.dev/api/public/user \ -H "Authorization: Bearer YOUR_API_KEY"
Response:
{
"id": "user123",
"email": "you@company.com",
"displayName": "Your Name",
"organizationId": "org123",
"meetingCount": 42,
"createdAt": "2024-01-15T10:00:00.000Z"
}GET /api/public/meetings
List and search your meetings.
| Parameter | Type | Description |
|---|---|---|
limit | number | Max results (default 20, max 100) |
offset | number | Skip N results for pagination |
keyword | string | Search by meeting title |
from | ISO date | Meetings after this date |
to | ISO date | Meetings before this date |
participant | string | Filter by participant email |
scope | string | personal (default) or org to include team meetings |
tag | string | Filter by tag ID |
curl "https://icecubes-app.fly.dev/api/public/meetings?limit=5&from=2024-06-01" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/meetings/:id
Get full meeting details including AI summary, key points, and action items.
curl https://icecubes-app.fly.dev/api/public/meetings/MEETING_ID \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/meetings/:id/transcript
Get the full transcript with speaker names and timestamps.
curl https://icecubes-app.fly.dev/api/public/meetings/MEETING_ID/transcript \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/action-items
List action items across all meetings or for a specific meeting.
| Parameter | Type | Description |
|---|---|---|
limit | number | Max results (default 20, max 100) |
offset | number | Skip N results for pagination |
meetingId | string | Filter by meeting |
completed | boolean | Filter by completion status |
curl "https://icecubes-app.fly.dev/api/public/action-items?completed=false&limit=10" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/search
Full-text search across transcripts, summaries, action items, notes, and key points.
| Parameter | Type | Description |
|---|---|---|
q | string | Search query (required) |
type | string | Filter by content type: transcript, summary, action_item, decision, note, key_point |
speaker | string | Filter by speaker name |
limit | number | Max results (default 20, max 50) |
offset | number | Skip N results for pagination |
curl "https://icecubes-app.fly.dev/api/public/search?q=competitor+pricing&type=transcript&limit=10" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/meetings/:id/insights
Get AI-extracted sales insights for a meeting.
| Parameter | Type | Description |
|---|---|---|
category | string | Filter by category: next_step, objection_budget, objection_authority, objection_need, objection_time, pricing, challenge, meddic_metrics, meddic_economic_buyer, meddic_decision_criteria, meddic_decision_process, meddic_identify_pain, meddic_champion |
curl "https://icecubes-app.fly.dev/api/public/meetings/MEETING_ID/insights?category=pricing" \ -H "Authorization: Bearer YOUR_API_KEY"
POST /api/public/action-items
Create a new action item.
Request body:
{
"meetingId": "abc123",
"text": "Follow up with client about pricing",
"assigneeEmail": "john@example.com",
"dueDate": "2026-03-01T00:00:00Z"
}Example:
curl -X POST https://icecubes-app.fly.dev/api/public/action-items \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"meetingId":"abc123","text":"Follow up with client"}'PATCH /api/public/action-items/:id
Update an action item (mark complete, change text, assignee, due date). All body fields are optional.
Request body:
{
"completed": true,
"text": "Updated text",
"assigneeEmail": "jane@example.com",
"dueDate": "2026-03-15T00:00:00Z"
}Example:
curl -X PATCH https://icecubes-app.fly.dev/api/public/action-items/ITEM_ID \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"completed":true}'GET /api/public/meetings/:id/notes and PUT /api/public/meetings/:id/notes
Read and write meeting notes.
GET response:
{
"content": "Meeting notes...",
"updatedAt": "...",
"version": 3
}PUT request body:
{
"content": "Updated meeting notes..."
}Examples:
curl https://icecubes-app.fly.dev/api/public/meetings/MEETING_ID/notes \
-H "Authorization: Bearer YOUR_API_KEY"
curl -X PUT https://icecubes-app.fly.dev/api/public/meetings/MEETING_ID/notes \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content":"Updated notes content"}'GET /api/public/contacts
List contacts from your meetings.
| Parameter | Type | Description |
|---|---|---|
search | string | Search by name or email |
domain | string | Filter by email domain |
limit | number | Max results (default 25, max 100) |
cursor | string | Pagination cursor from previous response |
curl "https://icecubes-app.fly.dev/api/public/contacts?search=john&limit=10" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/tags
List all available tags (organization and personal).
curl https://icecubes-app.fly.dev/api/public/tags \ -H "Authorization: Bearer YOUR_API_KEY"
Error Handling
All errors follow a consistent format:
{
"error": {
"code": "not_found",
"message": "Meeting not found"
}
}| HTTP Status | Code | Description |
|---|---|---|
| 401 | unauthorized | Missing, invalid, or revoked API key |
| 403 | forbidden | Not authorized to access this resource |
| 404 | not_found | Resource not found |
| 500 | internal_error | Server error |
Rate Limits
The API currently does not enforce strict rate limits, but please be reasonable with your usage. Excessive requests may be throttled. Rate limiting will be introduced in a future update.