The Modjo Model Context Protocol (MCP) server lets your AI assistant β Claude, ChatGPT, Cursor, Dust, n8n, and any other MCP-compatible client β read and analyze your Modjo workspace data: calls, deals, accounts, contacts, transcripts, and AI agents. You ask in plain language, Modjo answers from your actual data.
β οΈ Beta β endpoints, tool names, and default behavior may change without notice as we iterate. Don't wire it into mission-critical workflows yet. Bug reports and feedback shape what ships next.
How to connect to Modjo MCP?
We support two authentication methods. The choice matters for security and team rollout, so read this before you start.
OAuth 2.0 (recommended β use this by default)
Each user signs in with their own Modjo account.
Use OAuth for the entire team, including managers and admins, in 99% of cases.
Bearer token via HTTP header (admin / power-user only)
A workspace API key passed as an Authorization header. The token is organization-scoped β whoever holds it can read every call, every deal, and every account across the workspace, regardless of their role in Modjo.
This is the right tool when you genuinely need workspace-wide reach: building n8n pipelines, programmatic automations, or scripts owned by an admin. It is the wrong tool for individual reps. If a rep can use OAuth, they should.
| OAuth | Bearer token |
Who it's for | All users β reps, CSMs, managers | Admins, ops, automation owners |
Setup | Click "Connect", sign in | Generate API key, paste header |
Best for | Daily use in Claude, ChatGPT, Cursor | n8n workflows, scripts, server-side jobs |
Token rotation | Automatic | Manual |
Quick start with OAuth (most clients)
Step 1: Add custom connector to your workspace
This step should be carried on by the admin within your organization for Claude / ChatGPT / Dustβ¦
Here are the details for each client:
Claude (claude.ai web, Claude apps, Claude Code)
Go to Customize β Connectors β Add custom connector
Name: Modjo
URL:
https://api.mcp.modjo.ai/v1/mcpClick Connect, sign in with Modjo, approve access
The Modjo tools become available to Claude immediately. You can scope them per-project in Claude Projects.
ChatGPT
Open Settings β Connectors β New connector (requires ChatGPT Plus or higher, depending on rollout)
URL:
https://api.mcp.modjo.ai/v1/mcpSign in with Modjo when prompted
Cursor
Settings β MCP β Add new server
Paste
https://api.mcp.modjo.ai/v1/mcpApprove OAuth in the browser when Cursor prompts
Dust
Dust supports remote MCP servers natively.
Spaces β Tools β Add Tools β Add MCP Server
URL:
https://api.mcp.modjo.ai/v1/mcpChoose OAuth as the auth method, complete the sign-in
Assign Modjo tools to agents in the Agent Builder
For automation-style Dust agents where a single API key per workspace is acceptable, the Bearer Token option is also supported (see Bearer token setup below).
Other MCP-compatible clients
Any client supporting the MCP OAuth 2.0 spec (Authorization Code + PKCE with protected-resource metadata discovery) will work. Point it at https://api.mcp.modjo.ai/v1/mcp and let it handle the rest β the server publishes its OAuth metadata at the standard .well-known paths.
Step 2: Connect as a user
Once the custom connector has been added to your workspace all you need to do is go to your workspaceβs connectors (path depends on which client you use - see above), select Modjo and sign in! As simple as that.
Bearer token setup (admins & automations)
Use this only when OAuth isn't a fit β typically n8n workflows, scheduled scripts, server-to-server pipelines, or one-off admin queries that need workspace-wide reach.
1. Get your API key
Go to Settings β Integrations β Modjo API key in the Modjo app
Generate a key and store it somewhere safe β you won't see it again
2. Configure your client
The bearer token uses a slightly different endpoint that accepts the Authorization header directly:
<https://api.mcp.modjo.ai/v1/mcp>
Pass your key as Authorization: Bearer <your-api-key>.
n8n (version 1.88.0+)
n8n natively supports MCP since v1.88.0 β no community node, no extra install.
Mode A β With an AI Agent (autonomous tool calls):
Add an AI Agent node with your LLM credentials
Add an MCP Client Tool node, connect it to the Agent's Tools input
Configure the MCP Client Tool:
MCP Endpoint URL:
https://api.mcp.modjo.ai/v1/mcpAuthentication: Header Auth
Header name:
AuthorizationHeader value:
Bearer your-modjo-api-key-here
Under Tools to Include, choose All (or Selected for specific tools)
Mode B β Standalone (deterministic tool calls):
Add an MCP Client node
Configure:
Server Transport: Streamable HTTP
MCP Endpoint URL:
https://api.mcp.modjo.ai/v1/mcpSame Header Auth as Mode A
Select the Tool to execute from the dropdown
Map input parameters
Make / Zapier / Codex CLI / Gemini CLI / any HTTP MCP client
Same pattern everywhere:
{ "mcpServers": { "modjo": { "type": "http", "url": "<https://api.mcp.modjo.ai/v1/mcp>", "headers": { "Authorization": "Bearer your-modjo-api-key-here" } } } }
Security reminders for bearer tokens
Don't commit API keys to git. Use environment variables or your secrets manager.
Don't share keys between users. One key per automation or admin, rotated regularly.
A bearer key is workspace-wide. Anyone holding it can see every call, every deal, every account, including data from teams they don't normally have access to. Treat it like an admin password.
Prefer OAuth for individuals. Even admins doing daily analysis in Claude or ChatGPT should sign in with OAuth β keep the bearer token for systems, not seats.
Available tools
Twelve tools, three categories. Modjo agents are the most powerful β they produce structured analysis instead of raw data.
Search & retrieval
get_accountsβ list/search accounts (CRM ID, link, etc.)get_dealsβ list/search deals (amount, dates, status, source, loss reason)get_callsβ list/search calls (filter by deal, account, contact, date, user)get_contactsβ list/search contacts (CRM person ID, email, phone, title)get_usersβ list/search Modjo users (role, department)get_emailsβ list/retrieve emails with content
Content
get_transcriptβ full transcript of one or more calls, with timestamps and speakers
AI analysis (agent-first)
ask_anything_on_callβ AI question scoped to a single callask_anything_on_dealβ AI question scoped to a dealask_anything_on_accountβ AI question scoped to an account
Agent catalog
get_agentsβ list available agents (Modjo built-in or custom)
Using Modjo agents through the MCP
Instead of open-ended questions, point Modjo's specialized agents at your data. You get the same structured output every time, which makes results comparable across reps and deals.
Built-in agents
Agent | UUID | Best for |
CallSummary |
| CRM-ready call recap |
NextStepper |
| Actions and commitments (us vs them) |
MeetingPrepper |
| Pre-meeting brief + questions to ask |
CallQualifier |
| Structured qualification + gaps |
DealBriefing |
| Executive deal summary + risks |
EmailFollowUp |
| Follow-up email draft |
Example: pull next steps from a call
Find the call with
get_callsAsk Claude: "Use the NextStepper agent on call [ID] to extract every commitment. Separate our tasks from theirs, include dates."
The assistant calls
ask_anything_on_callwithagentUuid: "09715241-0cdd-44c9-a386-92a1340bdf4a"You get structured client-side and team-side actions with timestamps
Example: executive deal briefing
Get the deal CRM ID with
get_dealsAsk: "Use DealBriefing on deal [CRM_ID] for an actionable briefing β status, stakeholders, signals from recent calls, risks, expected decisions, close plan."
You get a document ready for forecast review or deal desk
Skill (for Claude, Dust, ChatGPT)
Drop this skill into your AI assistant to guide it through proper tool chaining and avoid the common pitfalls below.
--- ## Overview This skill enables the agent to use the **Modjo MCP server** to retrieve and analyze sales data: accounts, contacts, deals, calls, emails, call transcripts, and AI-powered insights via Modjo's built-in and custom agents. The agent should **always read this skill before making any Modjo MCP tool call** to follow the correct tool chaining patterns and avoid common pitfalls. --- ## Tool reference (accurate schemas) Filters are passed inside a `filters` object. Pagination uses `pagination: { cursor, limit }` (1β50, default 10). ### Data retrieval tools | Tool | Required filters | Optional filters | Key returns | | --- | --- | --- | --- | | `get_accounts` | `name` (string, required) | β | `crmId`, `name`, `crmLink`, `crm` | | `get_contacts` | β | `name` (string) | `crmPersonId`, `name`, `email`, `phoneNumber`, `jobTitle`, `crmLink` | | `get_deals` | β | `name`, `account.crmIds[]`, `status[]`, `closeDate{start,end}`, `amount{min,max}`, `source[]`, `startDate{start,end}`, `lossReason` | `crmId`, `accountCrmId`, `name`, `status`, `amount`, `startDate`, `closeDate`, `lossReason`, `source` | | `get_calls` | β | `name`, `accounts.crmIds[]`, `contact.crmIds[]`, `deal.crmIds[]`, `dateRange{start,end}`, `userIds[]` | `id`, `name`, `status`, `date`, `duration`, `direction`, `phoneProvider`, `crmLink`, `dealId`, `summary` | | `get_emails` | β | `subject`, `accounts.crmIds[]`, `contact.crmIds[]`, `deal.crmIds[]`, `dateRange{start,end}`, `userIds[]` | `id`, `subject`, `date`, `from`, `to`, `dealId`, `accountId` | | `get_transcript` | `callIds[]` (number[]) | β | Transcript blocks: `startTime`, `endTime`, `content`, `speakerName` | | `get_users` | β | `name`, `email` | `id`, `email`, `name`, `role`, `jobTitle`, `jobDepartment` | | `get_agents` | β | `search` (string), `creatorOrigin` ("modjo" or "user") | `uuid`, `name`, `description` | ### AI analysis tools | Tool | Required params | Optional params | Returns | | --- | --- | --- | --- | | `ask_anything_on_call` | `id` (string β call ID), `question` (string) | `agentUuid`, `language` | AI-generated answer about the call | | `ask_anything_on_account` | `crmId` (string β account CRM ID), `question` (string) | `agentUuid`, `language` | AI-generated answer about the account | | `ask_anything_on_deal` | `crmId` (string β deal CRM ID), `question` (string) | `agentUuid`, `language` | AI-generated answer about the deal | --- ## Critical schema notes (common pitfalls) 1. **`get_accounts` requires `name`** β the `filters.name` field is required, not optional. You cannot fetch all accounts without a name filter. If the user says "list all accounts", try a very short common substring or inform them that a name filter is needed. 2. **`get_calls` and `get_emails` use nested filter objects** β account, contact, and deal filters are nested: - Correct: `filters: { accounts: { crmIds: ["001..."] } }` - Wrong: `filters: { accountCrmIds: ["001..."] }` 3. **`dateRange` format** β uses `{ start: "YYYY-MM-DD", end: "YYYY-MM-DD" }` (ISO date strings, not datetimes). 4. **`get_transcript` takes `callIds` as numbers** β not strings. The call `id` from `get_calls` is a number (e.g., `74969`), pass it directly: `filters: { callIds: [74969] }`. 5. **`ask_anything_on_call` takes `id` as a string** β despite the call ID being a number in `get_calls`, the `ask_anything_on_call` tool expects it as a string: `id: "74969"`. 6. **`get_deals` returns `accountCrmId`** β this field links the deal to its parent account. Use it to cross-reference with `get_accounts` results. 7. **`get_deals` filtering capabilities** β `get_deals` supports rich server-side filtering. Use these instead of fetching all deals and filtering client-side: - `status` β string array. Valid values: `"Open"`, `"Closed won"`, `"Closed lost"`, `"Closed"`, `"Deleted"`. - `closeDate` β dateRange object: `filters: { closeDate: { start: "2026-03-23", end: "2026-04-05" } }` - `amount` β range object (both fields optional): `filters: { amount: { min: 10000, max: 50000 } }` - `source` β string array (max 50): `filters: { source: ["Inbound", "Outbound"] }` - `startDate` β dateRange object, same format as `closeDate` - `lossReason` β string, case-insensitive partial match (max 255 chars) - All filters can be combined. 8. **`get_calls` returns `summary`** β most calls already have a pre-generated summary. Check this before calling `ask_anything_on_call` for basic questions β the summary may already answer them. 9. **Pagination** β all list tools return `pagination: { hasNextPage, nextCursor, limit }`. If `hasNextPage` is true, pass `nextCursor` as `cursor` in the next call. Max 50 per page. Always use `limit: 50` when you need comprehensive results. 10. **`get_contacts` does NOT require `name`** β unlike `get_accounts`, the name filter is optional. 11. **`userIds` in `get_calls`/`get_emails`** β these are number arrays, not strings. Get the numeric `id` from `get_users` first. --- ## Using the `ask_anything_on_*` tools These are Modjo's most powerful capabilities β AI agents that analyze calls, accounts, and deals. **When to use them vs raw data:** - **Prefer `ask_anything_on_call`** over `get_transcript` for qualitative insight (objections, sentiment, competitors, next steps, coaching feedback). - **Use `get_transcript`** only when verbatim quotes are needed. - **Prefer `ask_anything_on_account`** for holistic relationship summaries β saves chaining multiple calls/emails lookups. - **Prefer `ask_anything_on_deal`** for deal health, risk, and next steps in one query. **How to pick an agent (`agentUuid`):** 1. Call `get_agents` first when the user needs specialized analysis (coaching, competitor analysis, MEDDPICC, churn detection, etc.) 2. Filter by `creatorOrigin: "modjo"` for built-in agents, `creatorOrigin: "user"` for custom agents 3. If no specific agent fits, **omit `agentUuid`** β the default agent handles general questions well 4. For French-speaking users/data, set `language: "fr"` to get responses in French **Built-in Modjo agents (always available):** | Agent | UUID | Best for | | --- | --- | --- | | CallQualifier | `3a7753e1-...` | Prospect profiles, qualification gaps | | CallSummary | `741e9ffc-...` | Quick call recaps, CRM-ready | | DealBriefing | `1204e84f-...` | Exec-ready deal summaries | | EmailFollowUp | `b2a9ae1b-...` | Auto-draft follow-up emails | | MeetingPrepper | `c0a76fd7-...` | Pre-meeting briefs | | NextStepper | `09715241-...` | Action items and commitments | --- ## Playbooks ### 1. π Call lookup for a specific company **Trigger**: "Show me calls with [Company]", "What was discussed with [Company]?", "Any recent calls about [topic]?" **Steps**: 1. `get_accounts` β filter by company name β extract `crmId` 2. `get_calls` β filter by `accounts.crmIds` β list calls (you can filter directly by account, you don't always need to go through deals first) 3. *(Optional)* `get_deals` β filter by `account.crmIds` β if deal-level filtering is needed 4. For interesting calls β check the `summary` field first, then use `ask_anything_on_call` for deeper analysis **Output**: Summary of calls (date, duration, direction, key points), with AI insights on notable calls. ### 2. π Prepare a meeting **Trigger**: "Help me prepare for my meeting with [Person/Company]", "Brief me before my call" **Steps**: 1. `get_contacts` β filter by contact name β extract `crmPersonId`, `jobTitle` 2. `get_accounts` β filter by company name β extract `crmId` 3. `get_deals` β filter by `account.crmIds` β pipeline context 4. `get_calls` β filter by `contact.crmIds` or `accounts.crmIds` β recent interactions (use `limit: 50` + `dateRange` for last 90 days) 5. `get_emails` β filter by `contact.crmIds` or `accounts.crmIds` β recent email exchanges 6. `ask_anything_on_account` β "What are the key topics discussed, open issues, and relationship status with this account?" 7. *(Optional)* `ask_anything_on_deal` β "What are the current risks and recommended next steps?" **Output**: Structured meeting brief β contact profile, account overview, deal status, recent interaction summary, AI-generated talking points and risks. ### 3. π₯ Deal prioritization **Trigger**: "Which deals should I focus on?", "What are my hot deals?", "Prioritize my pipeline" **Steps**: 1. `get_deals` β filter by `status: ["Open"]` and optionally `closeDate` for the relevant window and/or `amount: { min: X }` to focus on material deals β use `limit: 50` 2. `get_calls` β filter by `deal.crmIds` β assess activity recency and frequency 3. `get_emails` β filter by `deal.crmIds` β assess email engagement 4. `ask_anything_on_deal` β for top deals, ask about momentum, blockers, and buying signals **Scoring framework**: - π΄ Hot: Recent interactions + high amount + close date imminent + positive AI signals - π‘ Warm: Some activity + medium amount + close date within quarter - π΅ Cold: No recent interactions + stalled + past close date + low engagement **Output**: Ranked deal list with priority, AI rationale, and recommended next action per deal. ### 3b. π
Pipeline review (weekly/monthly) **Trigger**: "Pipeline review for this week", "Deals closing this month", "What's overdue?" **Steps**: 1. `get_deals` β filter by `status: ["Open"]` + `closeDate: { start: "<period_start>", end: "<period_end>" }` β deals expected to close in the window 2. `get_deals` β filter by `status: ["Open"]` + `closeDate: { start: "<past_date>", end: "<yesterday>" }` β overdue deals 3. `get_deals` β filter by `status: ["Closed won", "Closed lost"]` + `closeDate` for same window β recently closed 4. For each deal β `get_calls` + `get_emails` filtered by `deal.crmIds` β assess recent activity 5. `ask_anything_on_deal` β for key deals, ask about health, risks, and next steps **Output**: Structured pipeline review β overdue deals, deals closing soon, recently won/lost, with activity levels and AI-driven recommendations per deal. ### 4. π Win/Loss analysis **Trigger**: "Why did we lose deals?", "Win patterns?", "Analyze closed deals in [period]" **Steps**: 1. `get_deals` β filter by `status: ["Closed won"]` + optionally `closeDate` for the period β won deals 2. `get_deals` β filter by `status: ["Closed lost"]` + same `closeDate` β lost deals. Use `lossReason` filter for a specific loss pattern 3. `get_calls` β filter by `deal.crmIds` β associated calls 4. `get_agents` β search for a win/loss or analysis agent 5. `ask_anything_on_deal` β for sample of won/lost deals, ask about key outcome factors, competitor mentions, pricing objections **Output**: Win/loss report β quantitative breakdown (win rate, deal size, top loss reasons) + AI qualitative insights + recommendations. ### 5. π€ Contact intelligence **Trigger**: "Tell me about [Contact]", "What's my history with [Person]?" **Steps**: 1. `get_contacts` β filter by name β extract `crmPersonId`, `jobTitle`, `email` 2. `get_calls` β filter by `contact.crmIds` β interaction history 3. `get_emails` β filter by `contact.crmIds` β email threads 4. `ask_anything_on_call` β for recent calls, assess tone, concerns, and sentiment **Output**: Contact profile + interaction timeline + AI relationship insights. ### 6. π
Activity review (team or individual) **Trigger**: "What happened this week?", "Show me [Rep]'s activity", "Team activity in Q1?" **Steps**: 1. *(If filtering by rep)* `get_users` β filter by name/email β extract numeric `id` 2. `get_calls` β filter by `dateRange` and `userIds` β retrieve calls 3. `get_emails` β filter by `dateRange` and `userIds` β retrieve emails 4. *(Optional)* Enrich with `get_accounts`/`get_deals` for context **Output**: Activity summary β call count, email count, deals touched, highlights by rep or team. ### 7. π’ Account deep dive **Trigger**: "Full picture of [Company]", "Status of our relationship with [Account]?" **Steps**: 1. `get_accounts` β filter by name β extract `crmId` 2. `ask_anything_on_account` β comprehensive AI summary (this alone provides great insight) 3. *(Optional)* `get_deals` β filter by `account.crmIds` β pipeline detail 4. *(Optional)* `ask_anything_on_deal` β per active deal, assess status and next steps **Output**: Account brief β relationship history, key themes, active deal status, recommended actions. ### 8. π€ Agent-assisted custom analysis **Trigger**: When the user asks for coaching feedback, competitor analysis, objection handling, MEDDPICC, BANT, churn detection, or any specialized analysis type. **Steps**: 1. `get_agents` β search by keyword (e.g., "coaching", "competitor", "MEDDPICC", "churn") β extract `uuid` 2. Locate the target entity via `get_calls`, `get_accounts`, or `get_deals` 3. Use the agent's `uuid` in the appropriate `ask_anything_on_*` tool **Notable custom agents available**: CallScorer, ChurnInspector, Deal Challenger (MEDDPICC), DealRiskDetector, ProductFeedbacksAggregator, QuickBANT, SalesCoach, MeddicValidator, Objectionshunter. **Output**: Specialized analysis powered by the matched Modjo AI agent. --- ## General principles - **Always chain tools** β never rely on a single tool when richer context is available from combining multiple. - **Start broad, then narrow** β resolve account/contact CRM IDs first, then filter calls/emails by those IDs. - **Check summaries first** β `get_calls` returns a `summary` field. Read it before making additional `ask_anything_on_call` calls. - **Prefer `ask_anything_on_*` for qualitative analysis** β these provide richer, AI-synthesized insights than raw transcript reading. - **Use `get_agents` proactively** β when a specialized analysis type is requested, check for a matching agent before defaulting to generic questions. - **Use `get_users` for team filtering** β resolve rep names to numeric `id` values before filtering calls/emails by `userIds`. - **Respect pagination** β max 50 records per page. Use `limit: 50` and paginate with `nextCursor` when needed. - **Synthesize, don't dump** β always summarize and interpret data, never raw-dump JSON results. - **Surface next actions** β conclude with clear, actionable next steps for the sales rep. - **Language** β if the user writes in French or the data is in French, set `language: "fr"` on `ask_anything_on_*` calls.Other relevant information
Best practices
Standardize questions per agent. Same wording β comparable outputs across the team.
Anchor the time scope. "Over the last 30 days" or "since the last call" β otherwise the agent crawls everything.
Ask for evidence. Add "cite what was said and by whom" to force timestamped quotes.
Use pagination. Search tools cap at 50 results per page; iterate with
nextCursorwhen you need the full set.Combine filters.
get_callsaccepts deal + dateRange + userIds simultaneously β narrow before you analyze.Document your agent UUIDs. A team-internal cheat sheet of agent β use case speeds adoption.
Limits & constraints
Date format:
YYYY-MM-DDfor anydateRangefilter. Anything else throws.No stats tool. Need call counts or total duration? Pull via
get_calls, compute client-side.Pagination required. Max 50 results per page across all search tools.
UTF-8 in searches. Use
Γ©,Γ¨,Γliterally β not\\uXXXXescapes.AI latency.
ask_anything_*can take several seconds on long transcripts. Some clients enforce a 60-second tool timeout β keep that in mind for deep account-level queries.
Troubleshooting
OAuth sign-in loops or fails
Make sure you're already signed in at app.modjo.ai in the same browser before starting the OAuth flow. Clear cookies for modjo.ai if it keeps looping.
Tools don't appear after connecting
Wait 30 seconds and refresh. If they still don't show, check that the URL is exactly https://api.mcp.modjo.ai/v1/mcp (no trailing slash, no typos) and that your client supports remote MCP with OAuth.
401 / 403 errors with bearer token
Check the key is correct and the header is exactly Authorization: Bearer <key> (with the space). Test with curl:
curl -H "Authorization: Bearer your-key" <https://api.mcp.modjo.ai/v1/mcp>
ask_anything_on_deal or _account times out
These crawl a lot of data. Two causes:
The client enforces a 60-second tool timeout
The deal/account has hundreds of calls
Narrow the scope (date range, specific call IDs) or use the call-level variant.
Tools work but data feels stale
MCP queries are near real-time. There's typically a few-second delay between a call ending and its availability via MCP β wait a minute and retry.
