Salespeak MCP Server
Model Context Protocol server for AI-powered sales intelligence, analytics, and knowledge base management.
Use Cases
Connect your MCP client (Claude Desktop, ChatGPT, Cursor, or any MCP-compatible app) and use natural language to access your sales data.
Getting Started
Add this server to any MCP-compatible client. The server uses OAuth 2.1 for authentication—your client will handle the login flow automatically.
MCP Client Configuration
Add the following to your MCP client config (e.g. claude_desktop_config.json):
{
"mcpServers": {
"salespeak": {
"url": "https://platform.salespeak.ai/mcp",
"transport": "streamable-http"
}
}
}
How Authentication Works
The /mcp endpoint requires a valid Bearer token. When your MCP client connects, it will:
- Discover OAuth metadata via
/.well-known/oauth-authorization-server - Register itself as a client via
/oauth/register(Dynamic Client Registration) - Redirect you to the Salespeak login page
- Exchange the authorization code for tokens
- Attach the Bearer token to all subsequent MCP requests
OAuth Setup
If you are building a custom MCP client or integration, follow these steps to authenticate.
Register Your Client
Send a POST request to register your application and obtain credentials.
POST /oauth/register
Content-Type: application/json
{
"client_name": "My MCP Client",
"redirect_uris": ["https://myapp.example.com/callback"],
"grant_types": ["authorization_code", "refresh_token"],
"response_types": ["code"],
"token_endpoint_auth_method": "client_secret_basic"
}
Response includes client_id and client_secret.
Start Authorization
Redirect the user to the authorization endpoint with PKCE.
GET /oauth/authorize?
client_id=YOUR_CLIENT_ID&
redirect_uri=https://myapp.example.com/callback&
state=RANDOM_STATE&
code_challenge=BASE64URL_SHA256_CHALLENGE&
code_challenge_method=S256&
scope=openid profile email
The user will be redirected to the Salespeak login page.
Exchange Code for Tokens
After the user logs in, exchange the authorization code for access and refresh tokens.
POST /oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=AUTHORIZATION_CODE&
code_verifier=ORIGINAL_CODE_VERIFIER&
client_id=YOUR_CLIENT_ID
Response:
{
"access_token": "eyJ...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "eyJ..."
}
Use the Token
Include the access token in all MCP requests via the Authorization header.
Authorization: Bearer eyJ...
When the token expires, use the refresh token with grant_type=refresh_token at the token endpoint.
Company Context MCP
A second, read-only endpoint for agents that need to get your company right: your own assistants, a customer-facing bot, a workflow. It has one tool, ask_semantic_layer, and answers only from your knowledge bank.
https://platform.salespeak.ai/gtm-context/mcp
Connect with a signed-in user (OAuth)
Add the URL to an MCP client such as Claude or ChatGPT. The client discovers OAuth from the endpoint, and you sign in with your Salespeak account. Answers come from the organization you belong to.
claude mcp add --transport http salespeak https://platform.salespeak.ai/gtm-context/mcp
Connect an agent with an API key
For an agent that runs with no one signed in, create a key in the Salespeak app (Publish → API keys) and send it as a Bearer token. A key belongs to one organization, can only read, and works on this endpoint only. It is shown once when you create it. Revoking it takes effect within 30 seconds.
claude mcp add --transport http salespeak https://platform.salespeak.ai/gtm-context/mcp --header "Authorization: Bearer spk_..."
ask_semantic_layer
Ask any question about the company. The answer is structured so the calling agent can check it.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Required | The question, claim or text to check. |
persona | string | Optional | The audience to tailor the answer for, e.g. "RevOps leader". |
focus | string | Optional | The angle to emphasize, e.g. "pricing". |
answer_format | string | Optional | "text" (default) or "html". |
session_id | string | Optional | Reuse one id across calls to group a conversation. |
The result:
| Field | Meaning |
|---|---|
status | answered, partial (see gaps) or not_in_kb. On not_in_kb, do not fill the gap from elsewhere. |
answer | The answer text. |
records | The knowledge bank records associated with the answer: id, question, excerpt, source URLs, authority, last_updated. They show where the answer came from. They are not proof that it follows from them: each carries verification: "unverified". |
authority | How a record entered the knowledge bank, strongest first: approved (someone at the company approved it), customer_provided, discovered (found on a page), generated. |
authority_summary | The weakest authority among the records the answer used. |
freshness | The oldest and newest last_updated among those records. |
gaps | Parts of the question the knowledge bank does not cover. |
conflicts | Records that disagree with each other, by id. |
request_id | Quote this when reporting a problem. |
Limits: 30 requests per minute per caller, 120 per minute and 5,000 per day per organization. A request over a limit returns a tool error that says which limit and when to retry.
Tools Reference
The authenticated /mcp endpoint exposes 10 tools. All tools automatically resolve the caller's organization from the OAuth token.
answer_prospect_question
Get sales-ready answers about products, pricing, objection handling, and competitive positioning from your knowledge base.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Required | The sales question or objection to address. |
session_id | string | Optional | Session identifier for conversation continuity. |
tone | string | Optional | Response style: "concise", "detailed", "executive". |
length | string | Optional | Response length: "short", "long". |
persona | string | Optional | Seller persona: "SDR", "AE", "VP Sales". |
deal_stage | string | Optional | Deal stage context: "discovery", "demo", "negotiation". |
include_follow_ups | boolean | Optional | Include suggested follow-up questions. Default: false. |
analyze_conversations
Analyze what visitors are asking in chat conversations. Returns session counts, top questions, intent breakdown, and geography.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Required | Analytics question in natural language. |
time_range | string | Optional | Time period: "1d", "7d", "30d", or "90d". Default: "7d". |
page | string | Optional | Filter by landing page URL substring (e.g. "pricing"). |
intent | string | Optional | Filter by intent classification (e.g. "high", "medium"). |
output_format | string | Optional | "structured" (JSON + summary) or "prose". Default: "structured". |
analyze_llm_traffic
Analyze LLM bot traffic and AI search engine performance. Understand how ChatGPT, Perplexity, Claude, and others discover your content.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Required | Analytics question in natural language. |
time_range | string | Optional | Time period: "7d", "30d", or "90d". Default: "30d". |
analyze_website_chat_session_performance
Analyze which pages and traffic sources drive high-intent conversations and demo bookings.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Required | Analytics question in natural language. |
time_range | string | Optional | Time period: "7d", "30d", or "90d". Default: "30d". |
source | string | Optional | Filter by UTM source (e.g. "google", "linkedin"). |
page | string | Optional | Filter by landing page URL substring. |
output_format | string | Optional | "structured" (JSON + summary) or "prose". Default: "structured". |
analyze_llm_citations
Analyze which knowledge base sources the AI cites most in conversations. Understand citation coverage and content gaps.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Required | Analytics question in natural language. |
time_range | string | Optional | Time period: "7d", "30d", or "90d". Default: "30d". |
topic | string | Optional | Filter citations by topic (e.g. "pricing", "security"). |
output_format | string | Optional | "structured" (JSON + summary) or "prose". Default: "structured". |
detect_knowledge_gaps
Detect where the AI gets confused or lacks knowledge base citations. Find content gaps and areas needing improvement.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Optional | Analytics question. Default: general gap analysis. |
time_range | string | Optional | Time period: "7d", "30d", or "90d". Default: "30d". |
output_format | string | Optional | "structured" (JSON + summary) or "prose". Default: "structured". |
get_session_details
Get details of specific chat sessions. Retrieve full conversation history by session ID or search query.
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id | string | Optional | Specific session ID to retrieve. |
search_query | string | Optional | Search term to find in conversations. |
limit | integer | Optional | Maximum sessions to return. Default: 5. |
create_training_content
Add a question/answer pair to the knowledge base. Capture approved answers, objection handling, or FAQ entries.
| Parameter | Type | Required | Description |
|---|---|---|---|
question | string | Required | The question or objection to address. |
answer | string | Required | The approved answer/response. |
category | string | Optional | Category: "pricing", "objections", "features", etc. |
submit_url_for_training
Submit a URL to be crawled and added to the knowledge base. Add documentation, blog posts, or product pages.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Required | The URL to crawl and add. |
add_information_to_the_knowledge_bank
Add freeform text to the knowledge base. Content is processed by an LLM to extract Q&A pairs and automatically categorize information.
| Parameter | Type | Required | Description |
|---|---|---|---|
content | string | Required | The information/text to process and add. |
title | string | Optional | Title describing the content (helps organize extracted Q&As). |
custom_instructions | string | Optional | Instructions for the extraction LLM. |
Support
Need help?
Contact us at support@salespeak.ai or visit salespeak.ai.