The Tactiq MCP connector routes your AI agent's tool calls to Tactiq's own MCP server through Scalekit. Each user signs in to Tactiq once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 13 tools.
- Tools
- 13
- What they doRead · write · destructive
- 11 · 2 · 011 read2 write0 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Tactiq MCP connection
In AgentKit > Connections, create a Tactiq MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Tactiq MCP server, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'tactiqmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Tactiq MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'tactiqmcp_get_access_options',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "tactiqmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Tactiq MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="tactiqmcp_get_access_options",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_tooltactiqmcp_expand_transcript_excerptRead the conversation immediately around an excerpt returned by get_transcript_excerpts — the question it answered, the reply it drew.Read-onlyExpandTranscriptExcerpt
Read the conversation immediately around an excerpt returned by get_transcript_excerpts — the question it answered, the reply it drew. Use it when an excerpt reads as one side of an exchange, or when a name or number in it looks garbled and the surrounding words would settle it. IMPORTANT: Takes the `excerptId` of an excerpt from a recent get_transcript_excerpts call. References stop working after about an hour; when one does, search again and expand one of the fresh excerpts. IMPORTANT: Returns a short fixed window around the excerpt. Expanding the same excerpt again returns the same window, so to read further use get_transcript_excerpts with a more specific question. IMPORTANT: Rate limited: transcript excerpts can be read for at most 100 different meetings per hour per user; meetings already read in the window don't count again. IMPORTANT: Requires a Tactiq Team plan. Returns: `entries[]` (each: `text`, `speaker`, `startSeconds`, `endSeconds`, `isExcerpt`) in speaking order, and `url` which opens the transcript at the excerpt.
Inputs
excerptIdstringrequired- The `excerptId` of an excerpt from get_transcript_excerpts.
tactiqmcp_get_access_optionsFind out what the user can do about a Tactiq tool that refused their request — plan, connection, AI credits, or a meeting only shared as a preview — and show them that step.Read-onlyGet Access Options
Find out what the user can do about a Tactiq tool that refused their request — plan, connection, AI credits, or a meeting only shared as a preview — and show them that step. Call this immediately whenever another Tactiq tool returns an error whose body is `{ "error": "access_required", … }`, and whenever the user asks how to unlock or upgrade Tactiq. It never changes anything on the account. Returns: `access` (`action`, `title`, `message`, `cta`, `url`, optional `benefits[]`). Present `title`, `message` and the `benefits` to the user, with `url` as a link labelled `cta`, then stop — do not add your own explanation of the earlier error, and do not quote a price (the linked page shows it in the user's currency). When `action` is `ready`, retry the tool that was blocked instead.
Inputs
This tool takes no inputs.
tactiqmcp_get_generation_statusCheck whether a previously triggered AI generation (typically a detailed summary started by `get_meeting`) has finished.Read-onlyGetGenerationStatus
Check whether a previously triggered AI generation (typically a detailed summary started by `get_meeting`) has finished. Use this when `get_meeting` returned `detailedSummary: { status: 'generating', jobId }`. Poll periodically (a few seconds between calls is appropriate) until status is `ready` or `failed`. IMPORTANT: Requires a Tactiq Team plan. IMPORTANT: `failed` is terminal — generation will not produce content; do not keep polling. Re-call `get_meeting` to start a fresh attempt. Returns: `status` (`ready` | `generating` | `failed`) and `content` when status is `ready`.
Inputs
jobIdstringrequired- No description.
meetingIdstringrequired- Meeting id, as returned by search_meetings or list_recent_meetings. A Tactiq meeting link is accepted in its place.
tactiqmcp_get_meetingFetch a meeting's detailed AI-generated summary, plus the titles and ids of all other AI artifacts on it (action items, email drafts, CSVs, slide decks, and similar).Read-onlyGetMeeting
Fetch a meeting's detailed AI-generated summary, plus the titles and ids of all other AI artifacts on it (action items, email drafts, CSVs, slide decks, and similar). Use this as the primary way to read meeting content. The detailed summary is the richest single view of a meeting — call this before reaching for individual artifacts. IMPORTANT: Never returns the full transcript. IMPORTANT: If the summary doesn't exist yet, generation starts in the background and `detailedSummary` is returned as `{ status: 'generating', jobId }` instead of content. Poll `get_generation_status` with that jobId until status is `ready`. IMPORTANT: Requires a Tactiq Team plan. Workflow: 1. `get_meeting` → read `detailedSummary.content` when status is `ready`. 2. If you need a specific artifact, pass an id from `otherArtifacts[]` to `get_meeting_artifact`. 3. If the summary is generating, poll `get_generation_status({ meetingId, jobId })`. Returns: `id`, `title`, `createdAt` (ISO 8601), `durationSeconds`, `attendees[]`, `url`, `detailedSummary`, `otherArtifacts[]`.
Inputs
idstringrequired- Deprecated alias for `meetingId`. Meeting id, as returned by search_meetings or list_recent_meetings. A Tactiq meeting link is accepted in its place.
meetingIdstring- Meeting id, as returned by search_meetings or list_recent_meetings. A Tactiq meeting link is accepted in its place.
tactiqmcp_get_meeting_artifactFetch the full content of a specific AI-generated artifact on a meeting (summaries, action items, email drafts, slide decks, CSVs, and similar).Read-onlyGetMeetingArtifact
Fetch the full content of a specific AI-generated artifact on a meeting (summaries, action items, email drafts, slide decks, CSVs, and similar). Use this when `get_meeting` or `list_meeting_artifacts` has returned an artifact id you want to read, or when the detailed summary from `get_meeting` is insufficient and you need a specific artifact type. IMPORTANT: Never returns the full transcript. IMPORTANT: `artifactId` must come from `list_meeting_artifacts` or the `otherArtifacts[]` array inside `get_meeting` — do not guess or construct ids. IMPORTANT: Requires a Tactiq Team plan. Returns: `id`, `title`, optional `contentType` (e.g. `summary`, `email_draft`, `csv`, `slide_deck`), `content` (rendered text — markdown for summaries/slide decks, RFC 4180 CSV for tabular artifacts, plain-text email body for email drafts).
Inputs
artifactIdstringrequired- No description.
meetingIdstringrequired- Meeting id, as returned by search_meetings or list_recent_meetings. A Tactiq meeting link is accepted in its place.
tactiqmcp_get_transcriptRead a meeting's full transcript, one page at a time, in speaking order with speaker names and timestamps.Read-onlyGetFullTranscriptPaged
Read a meeting's full transcript, one page at a time, in speaking order with speaker names and timestamps. Prefer get_transcript_excerpts when you are looking for specific moments, quotes, or topics — it is faster and more precise. Use this pager only when you genuinely need the complete text (e.g. a full translation or rewrite). IMPORTANT: The transcript is returned in fixed pages. Start at page 1; `totalPages` tells you how many pages exist, and the same page number always returns the same content for a given meeting. IMPORTANT: Rate limited: full transcripts can be read for at most 10 different meetings per hour per user; meetings already read in the window don't count again. IMPORTANT: Requires a Tactiq Team plan. IMPORTANT: This tool requires the Tactiq connection to have been authorized with transcript access. If it returns an upgrade/permission message, disconnect and reconnect Tactiq and approve the "Read meeting details, summaries, transcript excerpts and full transcripts" permission on the consent screen. Returns: `page`, `totalPages`, `totalChars` (size of the whole transcript in characters), `hasMore`, `entries[]` (each: `text`, `speaker`, `startSeconds`, `endSeconds`), `url`. Cite `url` when you relay this content — it lets the user open the meeting to verify what was said.
Inputs
meetingIdstringrequired- Meeting id, as returned by search_meetings or list_recent_meetings. A Tactiq meeting link is accepted in its place.
pageinteger- Page number to read, starting at 1. Defaults to 1.
tactiqmcp_get_transcript_excerptsFind the verbatim transcript excerpts of a meeting that are relevant to a question — what exactly was said, by whom, and when.Read-onlyGetTranscriptExcerpts
Find the verbatim transcript excerpts of a meeting that are relevant to a question — what exactly was said, by whom, and when. Prefer this over get_transcript whenever you are looking for specific moments, quotes, decisions, or topics; fetch the full transcript only when you genuinely need the entire text. IMPORTANT: Returns at most 10 short excerpts per call. Each excerpt is a single moment; when one reads as half of an exchange, pass its `excerptId` to expand_transcript_excerpt to see what was said around it. IMPORTANT: `hasMore` tells you whether relevant excerpts were left out — when it is true, call again with a more specific question rather than assuming this is everything. IMPORTANT: An empty `excerpts` list means nothing matched the question's wording — NOT that the topic is absent from the meeting. Transcripts contain speech-recognition errors and people rarely speak in the question's exact terms, so rephrase (synonyms, related terms, a broader topic) and try again before concluding something was never discussed. IMPORTANT: Rate limited: transcript excerpts can be read for at most 100 different meetings per hour per user; meetings already read in the window don't count again. IMPORTANT: Requires a Tactiq Team plan. Returns: `excerpts[]` (each: `text`, `speaker`, `excerptId`, `startSeconds`, `endSeconds`, `url`), ordered most relevant first; `hasMore`; and `searchedWholeMeeting`. An empty list means nothing matched this wording — rephrase and retry before concluding the topic is absent. Each `url` opens the transcript at that excerpt — link to it when you quote or reference the excerpt.
Inputs
meetingIdstringrequired- Meeting id, as returned by search_meetings or list_recent_meetings. A Tactiq meeting link is accepted in its place.
querystringrequired- The question or topic to find transcript excerpts for, e.g. "what did they agree about pricing". At most 500 characters.
tactiqmcp_list_meeting_artifactsList all AI-generated artifacts on a meeting — summaries, action items, email drafts, slide decks, CSVs, and similar.Read-onlyListMeetingArtifacts
List all AI-generated artifacts on a meeting — summaries, action items, email drafts, slide decks, CSVs, and similar. Returns titles and ids only, no content. Use this when you already have a meetingId and want to discover what artifacts exist before fetching one, or when `get_meeting` has already been called and you want a lightweight refresh of the artifact list. Prefer `get_meeting` over this tool if you haven't fetched the meeting yet — `get_meeting` returns both the summary content AND the artifact list in one call. Use `get_meeting_artifact` with the returned ids to fetch actual artifact content. IMPORTANT: Requires a Tactiq Team plan. Returns `{ artifacts: [...] }`. Each artifact: `id`, `title`, optional `status` (`ready` or `generating`).
Inputs
meetingIdstringrequired- Meeting id, as returned by search_meetings or list_recent_meetings. A Tactiq meeting link is accepted in its place.
tactiqmcp_list_recent_meetingsList the user's most recent accessible meetings (owned + shared + team + space), sorted newest first.Read-onlyListRecentMeetings
List the user's most recent accessible meetings (owned + shared + team + space), sorted newest first. Returns meeting metadata only — never transcript content. Use this when the user wants to see recent meetings without specific search criteria (e.g. "show me my latest meetings", "what did I meet about this week"). Use `search_meetings` instead when the user names a topic, participant, or date range. Returns `{ results: [...] }`. Each result: `id`, `title`, `createdAt` (ISO 8601), `durationSeconds`, `attendees[]`, `url`. Use the `id` to fetch full content via `get_meeting` or `get_meeting_artifact`.
Inputs
archivedboolean- When true, include archived meetings.
limitinteger- No description.
spaceIdstring- List only the meetings filed in one space. Space id, as returned by list_spaces. A suggested space is addressed by the same field. Only a space the user can reach returns anything.
tactiqmcp_list_spacesList the spaces the user can reach, most recently met in first.Read-onlyList Spaces
List the spaces the user can reach, most recently met in first. A space is a named group of meetings — a project, a team, or a recurring meeting the user follows. Use this first whenever the user names a space ("what's been happening in Design Review?", "summarise the last month of the leadership space"). It gives you the `id` to pass to `search_meetings` or `list_recent_meetings`, which is how you read what is actually in one. Two kinds come back and both read the same way. A saved space is one the user made. A suggested space (`isSuggested: true`) is a recurring meeting Tactiq grouped on its own — the user has not saved it yet, so it cannot be shared or added to by hand, but its meetings are readable exactly like a saved space's. Don't describe a suggested space as though the user set it up. `meetingCount` and `lastMeetingAt` tell you which spaces are worth reading: prefer an active space over one nothing has been filed into for months, and say when a space is empty rather than reporting nothing found. A meeting can sit in a saved space and still belong to a suggested one, so don't add `meetingCount`s together or report the same meeting twice. Returns `{ spaces: [...], hasMore }`. Each space: `id`, `name`, `isSuggested`, optional `icon`, optional `meetingCount`, optional `lastMeetingAt` (ISO 8601), `url`. Cite `url` when you relay anything you read from a space. `hasMore` true means the user follows more recurring meetings than this list shows — say so rather than concluding a space doesn't exist.
Inputs
This tool takes no inputs.
tactiqmcp_search_meetingsSearch the user's accessible meetings (owned + shared + team + space) by topic, participants, or date range.Read-onlySearchMeetings
Search the user's accessible meetings (owned + shared + team + space) by topic, participants, or date range. Returns meeting metadata only — never transcript content. Use this when the user references one of: - a topic or subject matter → set `query` (e.g. "find meetings about Netflix" → query: "Netflix") - a person who joined → set `participants` (e.g. "meetings with David" → participants: ["David"], query left empty) - a time window → set `dateFrom` / `dateTo` These can be combined. Use `list_recent_meetings` instead if no search criteria are provided. IMPORTANT: Supply at least one of `query` / `participants` / `dateFrom` / `dateTo`. IMPORTANT: Do NOT put a participant's name in `query` — use `participants` for people. IMPORTANT: Do NOT include the current authenticated user in `participants`. `participantsMatch` modes: ANY (default) = at least one listed participant joined; ALL = every listed participant joined; NONE = none of them joined. Returns `{ results: [...] }`. Each result: `id`, `title`, `createdAt` (ISO 8601), `durationSeconds`, `attendees[]`, `url`, optional `snippet`.
Inputs
dateFromstring- ISO 8601 lower bound on the meeting created date (inclusive).
dateTostring- ISO 8601 upper bound on the meeting created date (inclusive).
limitinteger- No description.
participantsarray- Names or emails of OTHER people who joined the meeting. Do NOT include the current authenticated user — every result is already one of their meetings, so adding the caller will return zero results.
participantsMatchstring- How participants are matched. ANY (default) = at least one of the listed participants joined. ALL = every listed participant joined. NONE = none of them joined.one of
ANYALLNONE querystring- Free-text keywords to match against meeting title, notes, and AI outputs (summaries, action items). Use for topics and subject matter ("Netflix pricing", "Q3 roadmap"), NOT for participant names — those go in `participants`. Do NOT pad the query with conversational filler words from the user prompt (e.g. "today", "with", "agreed"); leave query empty if the user only specified a person and/or date.
spaceIdstring- Restrict the search to one space. Space id, as returned by list_spaces. A suggested space is addressed by the same field. Only a space the user can reach returns anything. Combine it with `query` to search inside a space.
tactiqmcp_record_access_card_eventInternal to the Tactiq access card.WriteRecord Access Card Event
Internal to the Tactiq access card. Records that the card was shown or its button pressed.
Inputs
actionstringrequired- What unlocks the refused request: upgrade (buy a Team plan), claim_seat (take a free seat on their paid team), request_seat (ask their team admin for one), reconnect (re-authorize Tactiq and approve the meeting-details permission), wait_for_credits (this month's AI credits are spent; existing summaries and transcripts still work), preview (the meeting's owner is on the free plan and only shares a preview of it), or ready (nothing to do — retry the original tool).one of
upgradeclaim_seatrequest_seatreconnectwait_for_creditspreviewready ctastringrequired- No description.
eventstringrequired- No description.one of
shownclicked resultSourcestringrequired- Whether the card got its option from the host or fetched it itself.one of
hostview
tactiqmcp_submit_feedbackReport a missing capability, a wrong result, or a workaround you needed with Tactiq tools, straight to the team that builds them.WriteSubmit Feedback
Report a missing capability, a wrong result, or a workaround you needed with Tactiq tools, straight to the team that builds them. After finishing a task that used Tactiq tools, check: was a capability missing, did a tool return wrong or incomplete results, did the user have to correct you, or did you need 3 or more calls where one should do? If so, file it — one report per distinct problem. Also use it when the user asks to send feedback about these tools or complains about one. You don't need to ask the user first. Do not use it for: problems with other connectors, the Tactiq web app or browser extension, support requests (nobody replies), errors that went away on retry, or test reports. This is feedback about the tools, not a record of the user's work. Every field describes the problem in general terms. Never include names, companies, meeting titles, quotes, transcript or meeting content, email addresses, links, ids, or anything else that identifies the user, the people they met or what was said: write "a sales call", not the call's title, and "the customer's lines", not what the customer said. Example — summary: "Add a speaker filter to transcript retrieval"; job_want: "Only the customer's lines from a sales call"; job_so_i_can: "See what each rep promised the customer"; feedback: "No filter exists, so I read the full transcript and filtered it myself across 4 calls." Returns: `status` — `received` once the report is filed.
Inputs
categorystringrequired- missing_capability: no tool could do what was needed. bug: a tool returned wrong, incomplete or broken results. workflow_friction: it worked, but took more calls or steps than it should. other: anything else about these tools.one of
missing_capabilitybugworkflow_frictionother feedbackstringrequired- What went wrong with the tools and what you expected instead: which tools you called and what kind of result they gave. Describe the tools' behaviour, not the user's data. In general terms only: no names, companies, meeting titles, quotes, transcript or meeting content, email addresses, links or ids.
job_wantstringrequired- The kind of thing the user asked for, in a sentence, e.g. "Only the customer's lines from a sales call". In general terms only: no names, companies, meeting titles, quotes, transcript or meeting content, email addresses, links or ids.
outcomestringrequired- completed: the user's task got done anyway. workaround: it got done another way. handed_back: you had to tell the user it couldn't be done.one of
completedworkaroundhanded_back sourcestringrequired- agent: you noticed the problem yourself. user: the user complained or asked you to send feedback.one of
agentuser summarystringrequired- Title of this feedback: the problem with the tools, like a ticket title, e.g. "Add a speaker filter to transcript retrieval". Not a summary of the user's conversation, meeting or transcript. In general terms only: no names, companies, meeting titles, quotes, transcript or meeting content, email addresses, links or ids.
calls_madeinteger- For workflow_friction: how many Tactiq tool calls the task took.
job_so_i_canstring- The kind of outcome the user was after. Fill it whenever the user said it — it decides priority. Never guess one they did not state. In general terms only: no names, companies, meeting titles, quotes, transcript or meeting content, email addresses, links or ids.
job_whenstring- The kind of situation the user was in when they asked, if known, e.g. "Preparing for a renewal call". In general terms only: no names, companies, meeting titles, quotes, transcript or meeting content, email addresses, links or ids.
requested_capabilitystring- For missing_capability: the capability you needed, as a short snake_case tag, e.g. filter_transcript_by_speaker.
tool_namestring- Name of the Tactiq tool this is about, exactly as listed, e.g. get_transcript.
No tools match.