MCP (Model Context Protocol) Server
MCP (Model Context Protocol) Server
The Salescaling MCP server allows AI agents like Claude, Cursor, and other MCP-compatible clients to access your meeting data, transcripts, and summaries in a structured and secure manner.
What is MCP?
Model Context Protocol (MCP) is a standard protocol that allows Large Language Models (LLMs) to interact with external systems in a structured way. The Salescaling MCP server implements this protocol to expose your meeting data through tools that AI agents can use.
Features
- ✅ Spec-Compliant: Full implementation of the official MCP protocol
- ✅ 11 Available Tools: Meetings (video calls and in-person), phone calls, search, listings, transcripts, summaries with action items, details, statistics, and more
- ✅ Advanced Search: Full Text Search for content-based searches across meetings and calls
- ✅ Payload Control: Configurable limits to prevent context overflow
- ✅ Secure Authentication: Salescaling API key or OAuth Clients (Authorization Code + PKCE)
- ✅ Multi-tenant: Automatic isolation by organization
- ✅ High Performance: Optimized for high volumes of activity with concurrency control
MCP Endpoints
The MCP server exposes two main endpoints:
GET /api/v1/mcp - List Tools
Returns the list of available tools with their input schemas.
Example:
curl -X GET https://api.salescaling.com/api/v1/mcp \
-H "X-API-Key: sk_xxx"
POST /api/v1/mcp - Call Tool
Executes a specific tool with the provided arguments.
Example:
curl -X POST https://api.salescaling.com/api/v1/mcp \
-H "X-API-Key: sk_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "search_meetings",
"arguments": {
"query": "performance",
"limit": 10
}
}'
MCP Connection via OAuth Clients
In addition to the API key, you can connect MCP clients that support OAuth 2.0 (Authorization Code flow with PKCE). OAuth clients are explicitly registered in Salescaling (there is no dynamic client registration on the authorization server).
Requirements
- Account with permissions to manage OAuth Clients (typically organization administrators).
- The MCP client must be able to complete the OAuth flow in the browser and send
Authorization: Bearer <access_token>to the MCP server.
Configure the client in Salescaling
-
In the platform, go to Settings → OAuth Clients.
-
Create a new OAuth client.
-
Add the allowed Redirect URIs. For Claude (Anthropic), use exactly:
https://claude.ai/api/mcp/auth_callback -
Assign the required scopes for the MCP (at minimum
meetings:readfor current meeting tools). -
Save the client and copy the
client_id(and the secret only if you created a confidential client; many MCP clients use public clients with PKCE).
Authorization Server Metadata
Salescaling exposes OpenID-compatible discovery metadata at the MCP endpoint itself:
GET https://api.salescaling.com/api/v1/mcp/.well-known/openid-configuration
There you will find the issuer, authorization_endpoint, token_endpoint, revocation_endpoint, and supported scopes (replace the host if you are using a different environment).
Example: MCP for Claude with OAuth
After creating the OAuth Client with the redirect above, configure the MCP client with the MCP server URL and OAuth endpoints (adjust domains if your tenant uses a different app URL):
{
"mcpServers": {
"salescaling": {
"url": "https://api.salescaling.com/api/v1/mcp",
"oauth": {
"authorizationUrl": "https://app.salescaling.com/oauth/authorize",
"tokenUrl": "https://api.salescaling.com/v1/oauth/token",
"clientId": "<client_id_created_in_oauth_clients>",
"scopes": ["meetings:read"]
}
}
}
}
Summary of typical URLs
| Usage | URL |
|---|---|
| MCP Server | https://api.salescaling.com/api/v1/mcp |
| Authorization (user login) | https://app.salescaling.com/oauth/authorize |
| Token (code exchange / refresh) | https://api.salescaling.com/v1/oauth/token |
| Redirect URI in Salescaling for Claude | https://claude.ai/api/mcp/auth_callback |
Requests to the MCP will use the access token in the Authorization: Bearer … header instead of X-API-Key.
Meetings vs. Phone Calls
Salescaling stores video calls, in-person meetings, and phone calls in the same meeting entity. To keep the MCP API clear:
- Tools whose name includes
meetings(search_meetings,list_meetings,find_meetings_by_participant) only include video calls and in-person meetings (they do not return phone calls). - The tools
list_calls,search_calls, andfind_calls_by_participantare dedicated to phone calls and support filters such as direction (INBOUND/OUTBOUND) and phone numbers. get_meeting_transcript,get_meeting_summary,get_meeting_details, andget_meeting_action_itemswork with any meeting or call ID (the same identifier).
Available Tools
1. search_meetings - Advanced Search
Searches video calls and in-person meetings by text in titles and/or transcripts (Full Text Search). Does not include phone calls; for that, use search_calls.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Search term |
scope | string | No | title, sentences, or all (default: all) |
fromDate | string | No | Start date (YYYY-MM-DD) |
toDate | string | No | End date (YYYY-MM-DD) |
limit | number | No | Maximum 50 (default: 20) |
Note: Only video call or in-person activities.
Example:
{
"name": "search_meetings",
"arguments": {
"query": "performance review",
"scope": "all",
"fromDate": "2024-12-01",
"limit": 10
}
}
2. list_meetings - List Meetings
Lists video calls and in-person meetings with structured filters (excludes phone calls).
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
keyword | string | No | Search in names / title |
fromDate | string | No | Start date |
toDate | string | No | End date |
limit | number | No | Maximum 50 (default: 20) |
skip | number | No | Pagination (default: 0) |
sortOrder | string | No | asc or desc — sort by start date (default: desc) |
participants | string[] | No | Participant emails |
organizers | string[] | No | Organizer emails |
Example:
{
"name": "list_meetings",
"arguments": {
"fromDate": "2024-12-01",
"toDate": "2024-12-31",
"participants": ["client@company.com"],
"limit": 20
}
}
3. get_meeting_transcript - Get Transcript
Gets the detailed transcript with speaker attribution (meeting or call).
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
transcriptId | string | Yes | Meeting or call ID |
language | string | No | Language code (e.g., "en", "es") |
maxSentences | number | No | Sentence limit (payload control) |
Payload Control:
- Auto-truncates at 10,000 sentences if
maxSentencesis not specified - Indicates in the response if the content was truncated
Example:
{
"name": "get_meeting_transcript",
"arguments": {
"transcriptId": "meeting-uuid-here",
"language": "en",
"maxSentences": 100
}
}
4. get_meeting_summary - Get Summary
Gets the AI-generated summary: text (summaryText), action items (actionItems / next_steps), and depending on the type, topics/highlights (meetings) or call insights (calls).
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
transcriptId | string | Yes | Meeting or call ID |
language | string | No | Language code |
Example:
{
"name": "get_meeting_summary",
"arguments": {
"transcriptId": "meeting-uuid-here",
"language": "en"
}
}
5. get_meeting_details - Full Details
Gets full details of a meeting (metadata + transcript + summary).
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Meeting ID |
includeTranscript | boolean | No | Include transcript (default: true) |
includeSummary | boolean | No | Include summary (default: true) |
maxSentences | number | No | Sentence limit in transcript |
Example:
{
"name": "get_meeting_details",
"arguments": {
"id": "meeting-uuid-here",
"includeTranscript": true,
"includeSummary": true,
"maxSentences": 500
}
}
6. find_meetings_by_participant - Find Meetings by Participant
Finds meetings where a specific person participated. Searches by name (partial match) or email (exact match).
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
participant | string | Yes | Participant name or email |
fromDate | string | No | Start date (YYYY-MM-DD) |
toDate | string | No | End date (YYYY-MM-DD) |
limit | number | No | Maximum 50 (default: 20) |
skip | number | No | Pagination (default: 0) |
sortOrder | string | No | asc or desc by start date (default: desc) |
titleFilter | string | No | Optional filter on meeting title (partial match) |
Features:
- Only video calls and in-person meetings (no phone calls).
- Email search: Exact match (case-insensitive)
- Example:
jon@company.comwill find only that exact email
- Example:
- Name search: Partial match
- Example:
Jonwill find "Jon Smith", "Jonathan", "Jon Doe", etc.
- Example:
- Returns full participant and organizer information
- Configurable sort order with
sortOrder
Examples:
Search by email:
{
"name": "find_meetings_by_participant",
"arguments": {
"participant": "jon@company.com",
"fromDate": "2024-12-01",
"limit": 20
}
}
Search by name:
{
"name": "find_meetings_by_participant",
"arguments": {
"participant": "Jon",
"fromDate": "2024-01-01",
"toDate": "2024-12-31",
"limit": 50
}
}
7. list_calls - List Phone Calls
Lists only phone calls (phonecall), with filters by date, title, participants, direction, and numbers.
| Parameter | Type | Required | Description |
|---|---|---|---|
titleFilter | string | No | Partial match in name/title |
fromDate / toDate | string | No | Date range (YYYY-MM-DD) |
limit | number | No | Maximum 50 (default: 20) |
skip | number | No | Pagination |
sortOrder | string | No | asc or desc (default: desc) |
direction | string | No | INBOUND or OUTBOUND |
participants | string[] | No | Participant emails |
fromNumber / toNumber | string | No | Partial filter by caller or destination number |
8. search_calls - Search Calls
Search in titles and/or transcripts only for phone calls. Parameters similar to search_meetings, plus optional direction, fromNumber, toNumber.
9. find_calls_by_participant - Calls by Participant
Same as find_meetings_by_participant but only for phone calls, with the same extra filters as list_calls (titleFilter, sortOrder, direction, numbers).
10. get_meeting_action_items - Summary Action Items
Returns the structured next steps from the AI summary for a meeting or call ID.
| Parameter | Type | Required |
|---|---|---|
meetingId | string | Yes |
language | string | No |
11. get_meetings_statistics - Aggregated Statistics
Totals, average durations by activity type, and top participants (limited sample). Configurable scope:
| Parameter | Type | Description |
|---|---|---|
fromDate / toDate | string | Optional range |
type | string | meetings (video+in-person), calls (phone only), or all (default) |
Configuration in MCP Clients
For OAuth (including Claude with redirect https://claude.ai/api/mcp/auth_callback), follow the MCP Connection via OAuth Clients section.
Claude Desktop (API Key)
-
Locate your configuration file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
- macOS:
-
Add the MCP server configuration:
{
"mcpServers": {
"salescaling": {
"url": "https://api.salescaling.com/api/v1/mcp",
"headers": {
"X-API-Key": "sk_your_api_key_here"
}
}
}
}
-
Restart Claude Desktop
-
Verify that the server is connected:
- Look for the tools icon in the interface
- You should see "salescaling" as an available server
- All 11 tools should be listed
Cursor IDE
-
Open Cursor settings (
Cmd/Ctrl + ,) -
Search for "MCP Servers" in the settings
-
Add the Salescaling server:
{
"mcp.servers": {
"salescaling": {
"url": "https://api.salescaling.com/api/v1/mcp",
"headers": {
"X-API-Key": "sk_your_api_key_here"
}
}
}
}
-
Restart Cursor
-
Use the server from the Cursor chat:
- Mention "@salescaling" in the chat
- Or ask directly: "Search for meetings about performance"
Other MCP Clients
For any MCP-compatible client:
- Server URL:
https://api.salescaling.com/api/v1/mcp - Authentication:
X-API-Keyheader with your API key - Protocol: Standard HTTP/HTTPS
- Format: JSON
Usage Examples
Example 1: Search Meetings with Claude
User: "Search for meetings about pricing from the last month"
Claude → POST /api/v1/mcp
{
"name": "search_meetings",
"arguments": {
"query": "pricing",
"scope": "all",
"fromDate": "2024-12-01",
"limit": 20
}
}
Claude: "I found 5 meetings about pricing:
1. Pricing meeting with Acme Corp - Dec 15, 2024
2. Pricing strategy review - Dec 10, 2024
..."
Example 2: Get Full Transcript
User: "Give me the full transcript of the meeting with ID abc-123"
Claude → POST /api/v1/mcp
{
"name": "get_meeting_transcript",
"arguments": {
"transcriptId": "abc-123",
"language": "en"
}
}
Claude: "Here is the meeting transcript:
[00:00 - 00:15] John Doe: Good morning everyone..."
Example 3: Analysis of Multiple Meetings
User: "Analyze the sales meetings from December and give me insights"
Claude:
1. List meetings → list_meetings (December)
2. For each meeting → get_meeting_summary
3. Analyze patterns and generate insights
Claude: "I have analyzed 15 meetings from December:
- Most discussed topics: pricing (8), implementation (6)
- Common objections: implementation time (5)
- Identified opportunities: 3 enterprise accounts..."
Response Format
All tools return responses in the standard MCP format:
{
"content": [
{
"type": "text",
"text": "Readable description of the result"
},
{
"type": "resource",
"resource": {
"uri": "salescaling://meeting/xxx",
"mimeType": "application/json",
"text": "{...structured JSON data...}"
}
}
]
}
Security and Privacy
Authentication
- Requests require an API key (
X-API-Key) or an OAuth access token (Authorization: Bearer) issued for an authorized OAuth Client - API keys are managed via Settings > API Keys; OAuth clients via Settings > OAuth Clients
- Each credential is linked to your organization (tenant)
Data Isolation
- The MCP server respects multi-tenant isolation
- You can only access meetings from your organization
- Your role and organization permissions are applied automatically
Best Practices
- Never share your API key: Treat it like a password
- Use environment variables: Do not hardcode the key in files
- Rotate keys periodically: Create new keys and delete old ones
- Set expiration dates: For temporary or test keys
- Monitor usage: Review access logs regularly
Limits and Quotas
Rate Limiting
The MCP server shares the same limits as the public API:
- Short term: 35 requests per second
- Medium term: 200 requests every 10 seconds
- Long term: 1000 requests per minute
Payload Limits
- Transcripts: Auto-truncates at 10,000 sentences
- Searches: Maximum 50 results per request
- Listings: Maximum 50 meetings per request
Use the maxSentences parameter to control transcript size.
Troubleshooting
Error: "Unauthorized - missing or invalid API key"
Cause: Invalid or missing API key
Solution:
- Verify that the
X-API-Keyheader is present - Confirm that the key is valid in Settings > API Keys
- Verify that the key has not expired
Error: "Unknown tool: xxx"
Cause: Incorrect tool name
Solution:
- Verify the tool name (case-sensitive)
- Use
GET /api/v1/mcpto see available tools - Valid names (among others):
search_meetings,list_meetings,get_meeting_transcript,get_meeting_summary,get_meeting_details,find_meetings_by_participant,list_calls,search_calls,find_calls_by_participant,get_meeting_action_items,get_meetings_statistics
Error: "Meeting not found"
Cause: Meeting ID does not exist or you do not have access
Solution:
- Verify that the ID is correct
- Confirm that the meeting belongs to your organization
- Use
list_meetingsto get valid IDs
The server does not appear in Claude Desktop
Solution:
- Verify that the configuration file is in the correct location
- Check that the JSON is valid (no syntax errors)
- Restart Claude Desktop completely
- Check Claude Desktop logs for errors
Very long responses or timeouts
Solution:
- Use
maxSentencesto limit transcripts - Reduce the
limitin searches and listings - Use
includeTranscript: falseif you only need the summary - Filter by date to reduce the dataset
Support
Need help with the MCP server?
- Email: support@salescaling.com
- API Documentation: https://api.salescaling.com/api/docs
- Community Slack: Join here
Additional Resources
Last updated: April 2026