GitHub + Linear Dev Workflows
Provides tools for interacting with GitHub repositories, issues, pull requests, releases, security alerts, and CI workflows; enables workflows like linking PRs to Linear issues, creating issues from failing CI, and tracking stale reviews.
Provides OAuth-based access to Google services; supports workflows involving Google Docs, Google Calendar, and Google Sheets.
Provides tools for reading and creating Google Calendar events; used for on-call handoffs, postmortem review dates, and scheduling.
Provides tools for creating and reading Google Docs; used for incident postmortems, design notes, and repo onboarding documentation.
Provides tools for reading and writing Google Sheets; used for flaky test ledgers, CI spend reports, and TODO/FIXME debt registers.
Provides tools for interacting with Linear issues, teams, projects, and cycles; enables creating and updating issues, linking work items, and syncing GitHub, CI, Slack, and postmortem actions into Linear.
Provides tools for creating and updating Notion pages and databases; enables changelogs, dependency records, and engineering wiki content from GitHub docs.
Provides tools for sending messages, posting alerts, reading threads, and managing Slack channels; enables notifications, standup digests, bug reports, deploy approvals, and incident timelines.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GitHub + Linear Dev Workflows Turn the failing CI on main into a Linear bug with the log excerpt and notify Slack"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GitHub + Linear Dev Workflows
CI failures, PRs and security alerts become Linear issues and Slack posts, evidence attached.
An MCP server with 25 workflows across GitHub, Linear, Slack, Notion, Google Docs, Google Calendar, Firecrawl, Google Sheets and Tavily. Each workflow is a prompt your agent runs as a slash command, over the 59 tools it needs and no others.
uv tool install https://github.com/r28ai/github-linear-mcp/releases/download/v0.1.0/github_linear_mcp-0.1.0-py3-none-any.whl
claude mcp add dev -- github-linear-mcpIt installs with uv from this repository's release, with no git and nothing to build; nothing but Charter and the libraries it uses comes from PyPI. To update, run the install line from the latest release. If a desktop app cannot find github-linear-mcp, give it the full path from which github-linear-mcp (where github-linear-mcp on Windows).
Then ask your agent to connect your apps, or run /mcp__dev__setup.
Connect your apps
Ask the agent to connect one ("connect Linear"). It tells you where to get that app's key and the command that stores it, and the next call works, with no restart. The agent never asks for a key in the chat.
Or connect everything this server uses from a terminal:
github-linear-mcp login # each app in turn
github-linear-mcp login github # just one
github-linear-mcp status # what is connectedTokens and keys go to your operating system's keychain (macOS Keychain, Windows Credential Manager, the Secret Service on Linux), and are checked with one read-only call to the app's own API before they are kept. Every key, token and OAuth client is yours: we register no app with any of these services, and nothing passes through a server of ours, because there isn't one.
App | How it connects | Or set |
GitHub | Your own key (get one), entered once. |
|
Linear | Your own key (get one), entered once. |
|
Slack | Your own key (get one), entered once. A bot token from your own Slack app, which the guide sets up in about three minutes. |
|
Notion | Your own key (get one), entered once. Then share the pages it should see with the integration. |
|
Browser sign-in, over your own OAuth client (make one). |
| |
Firecrawl | Your own key (get one), entered once. |
|
Tavily | Your own key (get one), entered once. |
|
A variable set in your client's config always wins over the keychain.
Related MCP server: MCP Setup Server
Workflows
Workflow | What you get | Apps |
Failing CI → bug with the log excerpt | A red main branch becomes an owned issue with the failing step quoted, not a channel ping. | GitHub, Linear, Slack |
Link every PR to its Linear issue | No orphan PRs, so cycle reports and changelogs stop missing work. | GitHub, Linear |
Security alerts → Linear | Critical alerts get owners and due dates in the tracker the team actually reads. | GitHub, Linear |
Leaked secret → page a human | An exposed key is an urgent issue and a loud message within minutes. | GitHub, Linear, Slack |
Release → changelog page and announcement | Every release has a readable changelog without a release manager writing it. | GitHub, Notion, Slack |
Standup digest per person | Yesterday's PRs and today's issues in a DM, so standup is about blockers. | GitHub, Linear, Slack |
Stale review nudger | PRs waiting more than a day get a polite DM to the right reviewer. | GitHub, Slack |
Linear issue → branch and draft PR | Starting work on an issue sets up the branch, the PR and the link. | Linear, GitHub |
Incident timeline → postmortem draft | The timeline is assembled from what happened, and action items are tracked from minute one. | Slack, GitHub, Google Docs, Linear |
Postmortem actions tracked to done | Follow-ups from the postmortem become linked issues with a review date. | Google Docs, Linear, Google Calendar |
Slack bug report → Linear | The thread becomes an issue with repro steps, and the thread gets the link. | Slack, Linear |
GitHub issues mirrored into Linear | Open-source reports enter the internal tracker without double triage. | GitHub, Linear |
Vendor deprecation → affected files | A deprecation notice arrives already mapped to the code that uses the old API. | Firecrawl, GitHub, Linear |
On-call handoff | The next on-call starts with open urgents and unread alerts in one message. | Google Calendar, Linear, GitHub, Slack |
Deploy approval from Slack | Production deploys gated on an explicit 'approve' in a thread, with the reviewer on record. | GitHub, Slack |
Flaky test ledger | Tests that fail and pass on retry get counted until one crosses the line and gets an issue. | GitHub, Google Sheets, Linear |
CI spend report | Which workflows burn the minutes, weekly, before the bill does it. | GitHub, Google Sheets, Slack |
PR → design note in Docs | A large PR gets a readable explanation for reviewers outside the team. | GitHub, Google Docs |
Dependency choice with real repo health | Library choices recorded with stars, activity and bus factor, not vibes. | Tavily, GitHub, Notion |
Slack debate → ADR in the repo | The decision and its reasons get committed next to the code they govern. | Slack, GitHub, Linear |
Repo onboarding doc | A new engineer gets a map of an unfamiliar repo and who to ask. | GitHub, Google Docs |
Stale PR cleanup | Month-old PRs are closed with a note and the author is told, so the queue means something. | GitHub, Slack |
TODO/FIXME debt register | Debt hiding in comments becomes a list someone can prioritise. | GitHub, Linear, Google Sheets |
Repo docs → engineering wiki | The wiki mirrors docs/ in the repo instead of drifting from it. | GitHub, Notion, Slack |
Release credits for contributors | Every release thanks the people who made it, by name. | GitHub, Slack |
Every prompt takes one optional argument, details: the repo, team, channel, customer or date range you mean, so the agent does not have to ask. In Claude Code, put it in quotes, or only its first word arrives:
/mcp__dev__failing_ci_to_bug_with_the_log_excerpt "repo acme/api, Linear team ENG, post in #eng-alerts"Reads run without asking. Before anything that creates, sends, changes or deletes, the prompt tells the agent to show you the call and wait.
17 of the 25 workflows need no Google or Granola credential.
Other clients
Claude Desktop: install uv if you have not, since Claude Desktop starts the server with it, then open the .mcpb from the latest release. Claude asks for any keys in its own settings and keeps them in your keychain. The first start takes a few seconds longer, while uv installs it.
VS Code (.vscode/mcp.json): VS Code asks for each key the first time the server starts and stores it securely. Leave out any you stored with login.
{
"inputs": [
{
"type": "promptString",
"id": "github-token",
"description": "GitHub: Personal access token",
"password": true
},
{
"type": "promptString",
"id": "linear-api-key",
"description": "Linear: Personal API key",
"password": true
},
{
"type": "promptString",
"id": "slack-bot-token",
"description": "Slack: Bot token (xoxb-\u2026)",
"password": true
},
{
"type": "promptString",
"id": "notion-api-key",
"description": "Notion: Integration secret (ntn_\u2026)",
"password": true
},
{
"type": "promptString",
"id": "google-client-secret",
"description": "Google: OAuth client secret",
"password": true
},
{
"type": "promptString",
"id": "firecrawl-api-key",
"description": "Firecrawl: API key",
"password": true
},
{
"type": "promptString",
"id": "tavily-api-key",
"description": "Tavily: API key",
"password": true
}
],
"servers": {
"dev": {
"type": "stdio",
"command": "github-linear-mcp",
"env": {
"GITHUB_TOKEN": "${input:github-token}",
"LINEAR_API_KEY": "${input:linear-api-key}",
"SLACK_BOT_TOKEN": "${input:slack-bot-token}",
"NOTION_API_KEY": "${input:notion-api-key}",
"GOOGLE_CLIENT_SECRET": "${input:google-client-secret}",
"FIRECRAWL_API_KEY": "${input:firecrawl-api-key}",
"TAVILY_API_KEY": "${input:tavily-api-key}",
"GOOGLE_CLIENT_ID": ""
}
}
}
}Cursor (.cursor/mcp.json) starts it the same way:
{
"mcpServers": {
"dev": {
"command": "github-linear-mcp"
}
}
}Codex (~/.codex/config.toml) starts a turn without waiting for a server unless it is required, and then the agent has none of its tools. required = true makes the session wait for it, and startup_readiness = "catalog" waits for its tool list rather than just its connection:
[mcp_servers.dev]
command = "github-linear-mcp"
required = true
startup_readiness = "catalog"
startup_timeout_sec = 30Name the server dev. A host builds each tool's name from that key, and a longer one can push a tool past the 64 characters a function name allows.
Built with Charter
Every tool here is a Charter declaration: a Pydantic schema saying where each field goes on the wire. Charter's runtime builds the request, attaches and refreshes the credential, and trims the response before the model reads it. It runs in your process, with no proxy and no telemetry.
The 59 tool schemas come to 57,249 tokens.
The same tools work in your own agent, without MCP:
from charter.adapters.openai import to_openai_tools
from charter_packs_mcp import FAMILIES
tools = FAMILIES["engineering"].tools()
definitions = to_openai_tools(tools) # or charter.adapters.langchainNeed an API that isn't here? Write a pack: your coding agent writes the declarations, and Charter's conformance suite checks them.
GitHub:
github_actions_list_workflow_runs,github_actions_list_jobs_for_run,github_actions_download_job_logs,github_pulls_list,github_dependabot_list_alerts,github_code_scanning_list_alerts,github_secret_scanning_list_alerts,github_releases_get_latest,github_repos_compare_commits,github_search_issues,github_pulls_list_requested_reviewers,github_git_refs_get,github_git_refs_create,github_pulls_create,github_repos_list_commits,github_issues_list_for_repo,github_issues_create_comment,github_search_code,github_notifications_list,github_actions_list_pending_deployments,github_actions_review_pending_deployments,github_actions_list_runs_for_workflow,github_checks_list_annotations,github_actions_get_run_usage,github_pulls_get,github_pulls_list_files,github_pulls_get_diff,github_search_repositories,github_repos_get,github_repos_list_contributors,github_repos_create_or_update_file,github_repos_get_readme,github_repos_list_languages,github_pulls_update,github_repos_get_content,github_releases_updateLinear:
linear_issue_create,linear_attachments_for_url,linear_search_issues,linear_attachment_create,linear_issues_list,linear_issue_get,linear_issue_relation_createSlack:
slack_chat_post_message,slack_conversations_open,slack_users_list,slack_conversations_history,slack_conversations_repliesNotion:
notion_pages_create,notion_pages_update_markdownGoogle Docs:
gdocs_documents_create,gdocs_documents_getGoogle Calendar:
gcalendar_events_insert,gcalendar_events_listFirecrawl:
firecrawl_monitor_create,firecrawl_monitor_checks_listGoogle Sheets:
gsheets_spreadsheets_values_append,gsheets_spreadsheets_values_updateTavily:
tavily_search
License
Apache 2.0.
Available Tools
61 toolsconnectA
Connect one app this server uses. For an app that issues keys, says where to get one and the terminal command that stores it. For Google, once the user's own OAuth client is set, starts the browser sign-in and returns at once: the user approves in the browser and the next call works. To see which apps are connected, call connection_status. Never ask the user for a key in the chat.
Inputs: app (required).
connection_statusARead-only
See which apps this server is connected to, and how to connect each one that is not. Changes nothing.
Inputs: no named parameters.
firecrawl_monitor_checks_listCRead-onlyIdempotent
List checks for a monitor.
Inputs: monitorId (required), limit, offset, status.
firecrawl_monitor_createB
Create a scheduled monitor for scrape, crawl, or search targets.
Inputs: name (required), targets (required), schedule (required), goal, +4 more.
gcalendar_events_insertC
Create a calendar event; returns details of the event.
Inputs: event (required), calendarId (required), sendUpdates, maxAttendees, +3 more.
gcalendar_events_listCRead-onlyIdempotent
List events matching a given search filter.
Inputs: calendarId (required), q, iCalUID, orderBy, +14 more.
gdocs_documents_createA
Create a blank document with a title. Only the title is honoured — the document is created empty. To add content, call this and then documents_batch_update with the returned documentId.
Inputs: body.
gdocs_documents_getARead-onlyIdempotent
Read a document's full structural content. The document ID is the long string in its URL, between '/d/' and '/edit'. Pass include_tabs_content=true for a document with several tabs, since the default response covers only the first.
Inputs: documentId (required), includeTabsContent, suggestionsViewMode.
github_actions_download_job_logsARead-onlyIdempotent
Read a failing job's log. Returns the last 200 lines plus every line that looks like an error, with the line numbers and the log's real length — not the whole file, which is routinely megabytes. Use this after actions_list_jobs_for_run has named the job; try checks_list_annotations first, which is cheaper when the check reported the failure with a file and a line.
Inputs: repo (required), jobId (required), owner (required).
github_actions_get_run_usageARead-onlyIdempotent
Get a run's total run time and its billable milliseconds per runner operating system. Billable minutes apply only to private repositories on GitHub-hosted runners. GitHub has this endpoint closing down.
Inputs: repo (required), owner (required), runId (required).
github_actions_list_jobs_for_runARead-onlyIdempotent
List a run's jobs, each with its conclusion and its failing steps named. This is what turns 'the run failed' into 'the pytest step of the test job failed', usually without reading a log at all.
Inputs: repo (required), owner (required), runId (required), page, +2 more.
github_actions_list_pending_deploymentsARead-onlyIdempotent
List the environments a run is waiting on for approval, and who can approve them. This is where a run sits when it is neither failing nor progressing.
Inputs: repo (required), owner (required), runId (required).
github_actions_list_runs_for_workflowARead-onlyIdempotent
List the runs of one workflow, most recent first — 'is this pipeline green', rather than 'is anything red'. The same single status filter as actions_list_workflow_runs, which matches a status or a conclusion.
Inputs: repo (required), owner (required), workflowId (required), page, +9 more.
github_actions_list_workflow_runsBRead-onlyIdempotent
List CI runs, most recent first. The single status filter matches either a run's status or its conclusion, so 'in_progress' and 'failure' are both valid there.
Inputs: repo (required), owner (required), page, actor, +7 more.
github_actions_review_pending_deploymentsA
Approve or reject a run's pending deployments. Takes the environment ids from actions_list_pending_deployments. A comment is required by GitHub, not optional.
Inputs: repo (required), owner (required), runId (required), state (required), +2 more.
github_checks_list_annotationsARead-onlyIdempotent
List a check run's annotations: each failure with the file, the line range, a level and a message, already extracted by whoever ran the check. The cheapest way to find out why a build is red — try this before downloading any log. GitHub returns at most 50 per page.
Inputs: repo (required), owner (required), checkRunId (required), page, +1 more.
github_code_scanning_list_alertsARead-onlyIdempotent
List code scanning alerts, each with the rule that fired and the file and line it fired on. Filter to one pull request with pr, or to a branch with ref. Needs GitHub Advanced Security on a private repository, which answers 403 without it.
Inputs: repo (required), owner (required), pr, ref, +9 more.
github_dependabot_list_alertsARead-onlyIdempotent
List a repository's Dependabot alerts: which dependency, how severe, and the first version that fixes it. Several filters take a comma-separated list, so state='open,dismissed' is valid. Needs the security_events scope. This endpoint has no page parameter — raise per_page rather than paging.
Inputs: repo (required), owner (required), has, sort, +12 more.
github_git_refs_createA
Create a branch or tag pointing at an existing commit. The reference must be fully qualified, like 'refs/heads/my-branch'.
Inputs: ref (required), sha (required), repo (required), owner (required).
github_git_refs_getARead-onlyIdempotent
Get a reference and the commit SHA it points at — how you read a branch's current head before building on it. ref is heads/main or tags/v1.0, without the refs/ prefix.
Inputs: ref (required), repo (required), owner (required).
github_issues_create_commentA
Post a comment on an issue or pull request. Pull requests take their own number here — GitHub treats them as issues for commenting.
Inputs: body (required), repo (required), owner (required), issueNumber (required).
github_issues_list_for_repoARead-onlyIdempotent
List issues in a repository. Note that GitHub counts pull requests as issues, so results include both; the ones that are pull requests are marked is_pull_request. Filter with state, labels, assignee or creator.
Inputs: repo (required), owner (required), page, sort, +9 more.
github_notifications_listARead-onlyIdempotent
List your unread notifications — mentions, review requests, assignments — most recently updated first. This is how an agent finds out it is needed without polling repositories. reason says why each one is here; url is the thing it concerns. Note per_page maxes at 50 here, not 100.
Inputs: all, page, since, before, +2 more.
github_pulls_createA
Open a pull request from head into base. Provide title for a new pull request, or issue to convert an existing issue into one — exactly one of the two. Both branches must already exist.
Inputs: body (required), repo (required), owner (required).
github_pulls_getARead-onlyIdempotent
Get a single pull request, including its mergeability and the counts of changed files, additions and deletions. These details are only present on this endpoint, not on pulls_list.
Inputs: repo (required), owner (required), pullNumber (required).
github_pulls_get_diffARead-onlyIdempotent
Get a pull request's whole change as a unified diff, in one call. The same endpoint as pulls_get asked for a different representation. Use it to read a change end to end; use pulls_list_files when the change is large enough to need paging, since this has no way to ask for less.
Inputs: repo (required), owner (required), pullNumber (required).
github_pulls_listARead-onlyIdempotent
List pull requests. Filter by state, by base branch, or by head in the form 'user:branch'.
Inputs: repo (required), owner (required), base, head, +5 more.
github_pulls_list_filesARead-onlyIdempotent
List the files a pull request changes, with per-file additions, deletions and patch text. A large pull request returns a lot of diff: keep per_page small and page through it.
Inputs: repo (required), owner (required), pullNumber (required), page, +1 more.
github_pulls_list_requested_reviewersARead-onlyIdempotent
List who has been asked to review and has not answered yet. A reviewer drops off this list once they submit, so an empty list means nobody is outstanding — not that nobody was asked.
Inputs: repo (required), owner (required), pullNumber (required).
github_pulls_updateA
Update a pull request's title, body, state or base branch. Closing one is state: closed; there is no REST way to change its draft status.
Inputs: repo (required), owner (required), pullNumber (required), base, +4 more.
github_releases_get_latestARead-onlyIdempotent
Get the latest published release — GitHub's definition, meaning the most recent release that is neither a draft nor a prerelease. Not simply the newest one.
Inputs: repo (required), owner (required).
github_releases_updateA
Update a release; anything omitted is left unchanged. Publishing a draft is this call with draft: false.
Inputs: repo (required), owner (required), releaseId (required), body, +7 more.
github_repos_compare_commitsARead-onlyIdempotent
Compare two refs and get what is in one and not the other: the status, how far ahead or behind, the commits and the changed files. basehead is one string, 'main...my-feature', with three dots. Across forks, prefix each side with its owner.
Inputs: repo (required), owner (required), basehead (required), page, +1 more.
github_repos_create_or_update_fileA
Create a file or replace an existing one, in a single commit. Write the content as plain text. To replace a file, read it first and pass its sha; without one GitHub treats this as a create and refuses if the path exists.
Inputs: path (required), repo (required), owner (required), content (required), +5 more.
github_repos_getARead-onlyIdempotent
Get a repository's metadata, including its default branch and topics.
Inputs: repo (required), owner (required).
github_repos_get_contentARead-onlyIdempotent
Read a file, or list a directory. Pass an empty path for the repository root. File contents come back decoded as text.
Inputs: path (required), repo (required), owner (required), ref.
github_repos_get_readmeARead-onlyIdempotent
Get the repository's README, decoded to text. GitHub picks the preferred file itself across the spellings a repository might use, which saves guessing at repos_get_content.
Inputs: repo (required), owner (required), ref.
github_repos_list_commitsARead-onlyIdempotent
List commits, newest first. Narrow with sha for a branch, path for one file's history, or since/until for a window.
Inputs: repo (required), owner (required), sha, page, +5 more.
github_repos_list_contributorsARead-onlyIdempotent
List contributors, most commits first — who to ask about a repository. GitHub links only the first 500 author email addresses to accounts; the rest come back anonymous. An empty repository returns an empty object.
Inputs: repo (required), owner (required), anon, page, +1 more.
github_repos_list_languagesARead-onlyIdempotent
List a repository's languages with bytes of code each — the quickest way to find out what a repository is written in before reading any of it. Answers with an object keyed by language, so there is nothing to page.
Inputs: repo (required), owner (required).
github_search_codeARead-onlyIdempotent
Search code across GitHub. Only default branches are indexed and only files under 384 KB. The query needs a real search term, not just qualifiers. This endpoint allows ten requests per minute and returns at most 1,000 results.
Inputs: q (required), page, perPage.
github_search_issuesARead-onlyIdempotent
Search issues and pull requests across GitHub with qualifiers, e.g. 'repo:owner/name is:issue is:open label:bug'. Use this when the repository is unknown or the filter is richer than issues_list_for_repo supports. Rate limited to 30 requests per minute.
Inputs: q (required), page, sort, order, +3 more.
github_search_repositoriesARead-onlyIdempotent
Search repositories with qualifiers, e.g. 'topic:cli language:go stars:>500'. Rate limited to 30 requests per minute.
Inputs: q (required), page, sort, order, +1 more.
github_secret_scanning_list_alertsARead-onlyIdempotent
List secret scanning alerts: which pattern matched, which provider, and whether the credential is still valid. The detected secret itself is never returned by this tool — it is dropped from the response whatever the request asked for, because triage does not need it. Requires administrator access.
Inputs: repo (required), owner (required), page, sort, +11 more.
gsheets_spreadsheets_values_appendC
Appends values to a spreadsheet.
Inputs: range (required), valueRange (required), spreadsheetId (required), valueInputOption (required), +4 more.
gsheets_spreadsheets_values_updateC
Sets values in a range of a spreadsheet.
Inputs: range (required), valueRange (required), spreadsheetId (required), valueInputOption (required), +3 more.
linear_attachment_createA
Link an issue to something outside Linear. Linear deduplicates by URL: creating an attachment whose URL is already on the issue updates that one rather than adding a second.
Inputs: variables (required).
linear_attachments_for_urlARead-onlyIdempotent
Find which issues an external URL is attached to. This is the tool for 'is this pull request already linked to an issue?'.
Inputs: variables (required).
linear_issue_createA
Create an issue. team_id and title are required; everything else is optional. The UUIDs for team, assignee, state and labels come from teams_list, users_list and workflow_states_list — Linear does not accept names here. Set parent_id to create a sub-issue.
Inputs: variables (required).
linear_issue_getARead-onlyIdempotent
Get one issue with its description, comments, sub-issues, relations and attachments. Accepts either the issue's UUID or its human identifier, such as 'ENG-123'.
Inputs: variables (required).
linear_issue_relation_createA
Link two issues as blocking, duplicate, related or similar. 'blocks' and 'duplicate' are directional: the issue in issue_id is the one doing the blocking, or the one that is the duplicate.
Inputs: variables (required).
linear_issues_listARead-onlyIdempotent
List issues, optionally filtered. Conditions on one filter object combine with AND. To find a team's open work, filter on team.key and state.type.
Inputs: variables.
linear_search_issuesARead-onlyIdempotent
Search issues by text, across titles and descriptions. Set include_comments to search inside comments too. This is full-text search; to filter on fields such as state or assignee, use issues_list.
Inputs: variables (required).
notion_pages_createA
Create a page — as a subpage of another page, or as a row of a database by giving its data_source_id as the parent. Content comes as a markdown string Notion parses into blocks, or from a template: one or the other, never both.
Inputs: body (required), filterProperties.
notion_pages_update_markdownA
Replace a page's content with Markdown, which Notion parses into blocks. This replaces the whole body, so read it first if you mean to edit rather than overwrite.
Inputs: body (required), pageId (required).
slack_chat_post_messageA
Send a message to a Slack channel, private group, or DM. Provide text for a plain message; set thread_ts to reply inside an existing thread.
Inputs: channel (required), text, parse, blocks, +13 more.
slack_conversations_historyBRead-onlyIdempotent
Fetch recent messages from a Slack channel.
Inputs: channel (required), limit, cursor, latest, +3 more.
slack_conversations_openA
Open a direct message with one person, or a group message with up to eight. The channel id for a following chat_post_message comes back at channel.id. Opening the same conversation twice returns the existing one rather than making another.
Inputs: users, channel, returnIm, preventCreation.
slack_conversations_repliesARead-onlyIdempotent
Fetch a thread of messages. Pass the parent message's ts as the thread identifier.
Inputs: ts (required), channel (required), limit, cursor, +4 more.
slack_users_listARead-onlyIdempotent
List members of the workspace. Use this to resolve a person's name to the user ID that Slack mentions and filters expect.
Inputs: limit, cursor, teamId, includeLocale.
tavily_searchA
Execute a real-time web search optimized for AI agents. Use when sources are unknown or current web context is needed. Prefer search_depth advanced with chunks_per_source 3 for stronger evidence per source.
Inputs: query (required), topic, country, endDate, +21 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 61 tools
Most tools have clearly distinct provider+resource+action scopes, and descriptions often explicitly disambiguate near-neighbors (e.g. actions_list_jobs_for_run vs download_job_logs vs checks_list_annotations). However, several pairs overlap enough to risk misselection: github_pulls_get vs github_pulls_get_diff, github_repos_get_content vs github_repos_get_readme, and github_actions_list_workflow_runs vs github_actions_list_runs_for_workflow.
The dominant pattern is service_resource_action (e.g. github_pulls_list, linear_issue_create, notion_pages_create), which is predictable and readable. Minor deviations exist: connect and connection_status lack a service prefix, and GitHub Actions tools use variable ordering (actions_get_run_usage, actions_list_workflow_runs), but nothing is chaotic.
61 tools is far beyond the 15-tool well-scoped range and spans at least eight services (GitHub, Linear, Google Docs/Calendar/Sheets, Slack, Notion, Firecrawl, Tavily). Even for a multi-app integration server, this breadth creates heavy surface area and cognitive load, making selection harder than it needs to be.
Coverage is broad but shallow in critical areas. For a dev-workflow server, there is no GitHub issue creation or update, no PR merge operation, no Linear issue update/delete, no Slack channel listing, and Google Docs batch update is referenced in descriptions but not exposed as a tool, creating dead ends in core workflows.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Open-source Zapier/n8n alternative as an MCP server: agents build, run and debug your workflows.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server that equips AI agents with dev workflow tools including GitHub project management, conventional commits, visual regression testing, Jira/Confluence integration, and a persistent memory knowledge graph.11 npmMIT
- FlicenseNot gradedqualityDmaintenanceA modular MCP server exposing tools for integrating with services like GitHub, Redash, Jenkins, Figma, Jira, Confluence, Teams, Datadog, PagerDuty, Slack, and Presto, enabling users to manage these platforms through natural language via an MCP client.-
- FlicenseAqualityCmaintenanceMCP server that enables AI assistants to run multi-step agent pipelines (e.g., Issue Analyst → Code Writer → Test Runner → PR Opener) from conversations, with support for Devin, shell, Python, and HTTP agents.7-
- FlicenseNot gradedqualityDmaintenanceEnterprise MCP server providing a suite of tools including file, database, GitHub, Slack, calendar, email, vector search, and Python execution, with safe defaults and OpenAI integration for automatic tool selection.-