# Modem — MCP server on mcp.ai > Connect your Modem account and use 30 tools for analytics straight from your AI agent. Connect with your own API key. Modem turns customer conversations into structured topics, people, and company insights for analysis and workflow automation. By: mcp.ai · official Page: https://mcp.ai/modem ## Connect (MCP protocol) Remote MCP endpoint (HTTP, streamable): https://api.mcp.ai/p_modem?ms=1787295960000 Add it as a custom/remote MCP connector, then authenticate when prompted. ## REST API (no MCP client required) Every tool is also a REST endpoint, authed with a workspace API key. Discover: GET https://api.mcp.ai/api/modem/_endpoints # public; lists every endpoint Call: POST https://api.mcp.ai/api/modem/ Authorization: Bearer sk_live_… # create one at https://mcp.ai/settings/api-keys Content-Type: application/json Body: { …args } → { "ok": true, "tool": "", "result": { … } } ## Developer docs How to use (MCP or REST), markdown: https://mcp.ai/modem/skill.md Postman collection (v2.1): https://mcp.ai/modem/postman.json ## Tools - modem_add_people_to_company(company_id: string, person_ids: string[], idempotency_key?: string) — Associate one or more existing people with an existing company. People already associated with the company are reported as skipped. This changes company membership, and the approved API surface has no - modem_create_companies(companies: object[], idempotency_key?: string) — Create one to 50 companies in one batch. Each item succeeds or fails independently; use a one-item array to create one company. - modem_create_people(people: object[], idempotency_key?: string) — Create one to 50 people in one batch. Each item succeeds or fails independently; use a one-item array to create one person. - modem_get_channel(channel_id: string) — Get one channel's source details, connection state, context, timestamps, and message count by UUID. - modem_get_company(company_id: string) — Get one company's core details, connection values, domain, logo, and VIP status by decimal ID. - modem_get_company_activity(company_id: string) — Get one company's message count, weekly activity series, and source-level message breakdown. - modem_get_company_history(limit?: integer, changed_by?: string[], company_id: string) — Get up to 50 company audit records plus merge history. The API reports the total audit count but exposes no cursor or page parameter, so this tool cannot retrieve records beyond the requested limit. - modem_get_company_identities(company_id: string) — Get external platform identities linked to one company by Modem's identify operation. - modem_get_current_organization() — Return the organization selected by the connected API key. Use this as an authentication smoke test and to confirm the active tenant; it returns no member, credential, or plan details. - modem_get_person(person_id: string) — Get one person's complete profile, including company, connections, tags, sources, timestamps, identities, and message activity aggregates. - modem_get_person_history(limit?: integer, person_id: string, changed_by?: string[]) — Get up to 50 person audit records plus merge history. The API reports the total audit count but exposes no cursor or page parameter, so this tool cannot retrieve records beyond the requested limit. - modem_get_person_identities(person_id: string) — Get all external platform identities linked to one person. - modem_get_person_source_stats(person_id: string) — Get one person's message counts broken down by source platform. - modem_get_topic(topic_id: string) — Get one topic's complete details, including its summary, classification, lifecycle, priority, keywords, time range, archive state, and event count. - modem_get_topic_groups(order?: string, topic_id: string) — Get every message group assigned to one topic in ascending or descending group-time order. Modem does not paginate or limit this endpoint, so topics with many deeply nested messages can return a large - modem_get_topic_history(limit?: integer, topic_id: string, changed_by?: string[]) — Get up to 50 topic audit records plus action and merge history. The API reports the total audit count but exposes no cursor or page parameter, so this tool cannot retrieve audit records beyond the req - modem_get_topic_people(topic_id: string) — Get every unique person who participated in one topic, including source identities, company, profile, VIP state, and contribution count. - modem_identify_external_records(idempotency_key?: string, identifications: object[]) — Upsert links from external platform records to Modem people and companies in batches of 50. Modem matches platform identities before natural keys, can create records only from the documented creation - modem_list_channels(limit?: integer, cursor?: string, search?: string, channel_ids?: string[], source_name?: string, connected_only?: boolean) — List organization channels with connection state and message counts, optionally filtered by source, name, or channel IDs. - modem_list_companies(limit?: integer, cursor?: string, search?: string, sort_by?: string, sort_order?: string) — List companies with person and message aggregates, optionally searching and sorting the result. Returns one page and an opaque continuation cursor. - modem_list_groups(limit?: integer, cursor?: string, person_id?: string, company_id?: string) — List message groups for exactly one company or one person, returning compact message content and topic context one page at a time. - modem_list_people(limit?: integer, cursor?: string, search?: string, sort_by?: string, company_id?: string, sort_order?: string, ecosystem_tags?: string[]) — List people with aggregated message statistics, optionally filtering by search text, ecosystem tags, or company and sorting the result. Returns one page and an opaque continuation cursor. - modem_list_topics(view?: string, limit?: integer, cursor?: string, search?: string, sort_by?: string, sources?: string[], date_end?: string, categories?: string[], date_start?: string, person_ids?: string[], priorities?: string[], sort_order?: string, company_ids?: string[], issue_types?: string[], product_ids?: string[], team_response?: string[], min_similarity?: number, exclude_sources?: string[], ticket_statuses?: string[], embedding_search?: string, lifecycle_states?: string[], exclude_categories?: string[], exclude_person_ids?: string[], exclude_priorities?: string[], exclude_company_ids?: string[], exclude_issue_types?: string[], exclude_product_ids?: string[], exclude_ticket_statuses?: string[]) — List or search topics by keywords or semantic meaning with organization, participant, source, status, date, and classification filters, one page at a time. Semantic search takes precedence when both s - modem_merge_companies(idempotency_key?: string, target_company_id: string, source_company_ids: string[], confirm_irreversible: boolean) — Irreversibly merge one or more source companies into one surviving target. All domains, person associations, and Slack workspaces move to the target, and source records cannot be restored by this API. - modem_merge_people(idempotency_key?: string, target_person_id: string, source_person_ids: string[], confirm_irreversible: boolean) — Irreversibly merge one or more source people into one surviving target. All identities, emails, and company associations move to the target, and source records cannot be restored by this API. Requires - modem_merge_topics(idempotency_key?: string, target_topic_id: string, source_topic_ids: string[], confirm_irreversible: boolean) — Irreversibly merge 1 to 50 source topics into one surviving target. Modem archives and marks every source as merged, then copies their group and event associations to the target; this API cannot undo - modem_update_companies(companies: object[], idempotency_key?: string) — Update one to 50 companies in one batch. Omitted fields remain unchanged, explicit null values clear nullable fields, and each item reports success independently. - modem_update_people(people: object[], idempotency_key?: string) — Update one to 50 people in one batch. Omitted fields remain unchanged, explicit null values clear nullable fields, and each item reports success independently. - modem_update_topic(archived?: boolean, keywords?: string[], priority?: string, topic_id: string, issue_type?: string, archived_reason?: string, idempotency_key?: string, lifecycle_state?: string) — Update one topic's priority, lifecycle, issue type, complete keyword list, or archive state. Omitted fields remain unchanged; issue_type=null clears the classification. - modem_update_topics(archived?: boolean, priority?: string, topic_ids: string[], archived_reason?: string, idempotency_key?: string) — Set priority or archive state for one to 100 topics at once. Provide at least one change, use archived=false to unarchive, and provide an archive reason only with archived=true. ## Example prompts - "What can I do in Modem?" - "Show me a summary of my Modem account" ## Links Docs: https://mcp.ai/docs/mcps/modem Website: https://mcp.ai/mcps/modem