Web Research to Docs
Provides tools for searching GitHub repositories and listing repository languages, supporting open-source landscape and due diligence research.
Provides browser-based Google OAuth sign-in, enabling access to Google Docs and Google Sheets for document and spreadsheet workflows.
Provides tools for creating Google Docs documents, so cited research reports and memos can be written directly into the team's Drive.
Provides tools for updating Google Sheets spreadsheet values, enabling structured outputs like market maps and pricing benchmarks to be stored in sheets.
Provides tools for creating and searching Linear issues and customer needs, enabling public complaints and web pages to become tracked roadmap evidence and issues.
Provides tools for creating Notion pages, allowing competitive digests, paper watch lists, and regulatory updates to be filed in Notion.
Provides tools for posting messages to Slack, so workflows can notify teams about new research, competitor changes, or regulatory updates.
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., "@Web Research to Docs run the competitive intel digest for our main competitors"
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.
Web Research to Docs
Competitor watch, cited research reports, paper alerts and market maps, filed where you read.
An MCP server with 10 workflows across Firecrawl, Tavily, Notion, Slack, Google Docs, Google Sheets, GitHub and Linear. Each workflow is a prompt your agent runs as a slash command, over the 19 tools it needs and no others.
uv tool install https://github.com/r28ai/web-research-to-docs-mcp/releases/download/v0.1.0/web_research_to_docs_mcp-0.1.0-py3-none-any.whl
claude mcp add research -- web-research-to-docs-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 web-research-to-docs-mcp, give it the full path from which web-research-to-docs-mcp (where web-research-to-docs-mcp on Windows).
Then ask your agent to connect your apps, or run /mcp__research__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:
web-research-to-docs-mcp login # each app in turn
web-research-to-docs-mcp login firecrawl # just one
web-research-to-docs-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 |
Firecrawl | Your own key (get one), entered once. |
|
Tavily | Your own key (get one), entered once. |
|
Notion | Your own key (get one), entered once. Then share the pages it should see with the integration. |
|
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. |
|
Browser sign-in, over your own OAuth client (make one). |
| |
GitHub | Your own key (get one), entered once. |
|
Linear | Your own key (get one), entered once. |
|
A variable set in your client's config always wins over the keychain.
Related MCP server: Freelancer Ops MCP
Workflows
Workflow | What you get | Apps |
Competitive intel digest | Site changes and news per competitor, weekly, in one page. | Firecrawl, Tavily, Notion, Slack |
Deep research → shared doc | A cited report in the team's Drive, not in someone's chat history. | Tavily, Google Docs, Slack |
Paper watch | New papers on your topics land in a reading list with abstracts. | Firecrawl, Notion, Slack |
Market map | Players, pricing, funding and positioning, one row each. | Tavily, Firecrawl, Google Sheets |
Pricing benchmark memo | Ten competitors' pricing pages normalised into one table and a recommendation. | Firecrawl, Google Sheets, Google Docs |
Regulatory watch | A regulator's guidance page changes and legal hears the same day. | Firecrawl, Notion, Slack |
Company due diligence | Public footprint, open-source activity and product surface in one memo. | Tavily, GitHub, Firecrawl, Google Docs |
Public complaints → roadmap evidence | What people complain about in your category, attached to the issues it supports. | Tavily, Firecrawl, Notion, Linear |
Open-source landscape | Who is building what in your space, with momentum, before you build it. | GitHub, Tavily, Notion |
Web page → Linear issue | A public bug report, forum post or status page becomes a tracked issue. | Firecrawl, Linear |
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__research__competitive_intel_digest "competitors acme.com and globex.com"Reads run without asking. Before anything that creates, sends, changes or deletes, the prompt tells the agent to show you the call and wait.
6 of the 10 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": "firecrawl-api-key",
"description": "Firecrawl: API key",
"password": true
},
{
"type": "promptString",
"id": "tavily-api-key",
"description": "Tavily: API key",
"password": true
},
{
"type": "promptString",
"id": "notion-api-key",
"description": "Notion: Integration secret (ntn_\u2026)",
"password": true
},
{
"type": "promptString",
"id": "slack-bot-token",
"description": "Slack: Bot token (xoxb-\u2026)",
"password": true
},
{
"type": "promptString",
"id": "google-client-secret",
"description": "Google: OAuth client secret",
"password": true
},
{
"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
}
],
"servers": {
"research": {
"type": "stdio",
"command": "web-research-to-docs-mcp",
"env": {
"FIRECRAWL_API_KEY": "${input:firecrawl-api-key}",
"TAVILY_API_KEY": "${input:tavily-api-key}",
"NOTION_API_KEY": "${input:notion-api-key}",
"SLACK_BOT_TOKEN": "${input:slack-bot-token}",
"GOOGLE_CLIENT_SECRET": "${input:google-client-secret}",
"GITHUB_TOKEN": "${input:github-token}",
"LINEAR_API_KEY": "${input:linear-api-key}",
"GOOGLE_CLIENT_ID": ""
}
}
}
}Cursor (.cursor/mcp.json) starts it the same way:
{
"mcpServers": {
"research": {
"command": "web-research-to-docs-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.research]
command = "web-research-to-docs-mcp"
required = true
startup_readiness = "catalog"
startup_timeout_sec = 30Name the server research. 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 19 tool schemas come to 38,591 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["research"].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.
Firecrawl:
firecrawl_monitor_checks_list,firecrawl_research_papers_search,firecrawl_research_paper_get,firecrawl_extract,firecrawl_monitor_create,firecrawl_crawl,firecrawl_scrapeTavily:
tavily_search,tavily_research_create,tavily_research_getNotion:
notion_pages_createSlack:
slack_chat_post_messageGoogle Docs:
gdocs_documents_createGoogle Sheets:
gsheets_spreadsheets_values_updateGitHub:
github_search_repositories,github_repos_list_languagesLinear:
linear_customer_need_create,linear_search_issues,linear_issue_create
License
Apache 2.0.
Available Tools
21 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_crawlC
Recursively crawl a website and scrape each discovered page.
Inputs: url (required), delay, limit, prompt, +15 more.
firecrawl_extractA
Extract structured data from one or more URLs using an LLM. Poll results with extract_status.
Inputs: urls (required), prompt, schema, showSources, +6 more.
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.
firecrawl_research_paper_getARead-onlyIdempotent
Inspect metadata or read passages from a research paper.
Inputs: id (required), k, query.
firecrawl_research_papers_searchCRead-onlyIdempotent
Search the research paper index with natural-language queries.
Inputs: query (required), k, to, from, +2 more.
firecrawl_scrapeB
Scrape a single URL and optionally extract information. Use when the user wants to read or summarize a specific webpage. Supports markdown, HTML, screenshots, and structured JSON extraction.
Inputs: url (required), proxy, maxAge, minAge, +22 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.
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_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.
gsheets_spreadsheets_values_updateC
Sets values in a range of a spreadsheet.
Inputs: range (required), valueRange (required), spreadsheetId (required), valueInputOption (required), +3 more.
linear_customer_need_createA
Record a customer request, optionally attached to an issue or project. This is the one Linear mutation whose reply carries no object — it answers only with whether it worked.
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_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.
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.
tavily_research_createA
Create an async research task that searches, analyzes sources, and generates a cited report. Poll results with research_get.
Inputs: input (required), files, model, outputLength, +4 more.
tavily_research_getARead-onlyIdempotent
Retrieve the status and results of a research task by request_id. HTTP 202 means still running; poll until HTTP 200.
Inputs: requestId (required), includeUsage.
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 21 tools
Most tools target clearly distinct resources (web search, crawl, scrape, Notion pages, Slack messages, Linear issues, GitHub repos), and descriptions provide usage guidance. However, the web research cluster (tavily_search, firecrawl_scrape, firecrawl_extract, tavily_research_create) has overlapping purposes that an agent could confuse without careful reading.
All names use snake_case with app prefixes, but the ordering is mixed: some are verb_noun (github_search_repositories, linear_search_issues) while others are noun_verb (notion_pages_create, gdocs_documents_create, linear_issue_create). The server-level tools 'connect' and 'connection_status' also lack the app-prefix pattern, making the set readable but not fully predictable.
21 tools is on the heavy side for a server named 'Web Research to Docs', and the surface sprawls across web search, document creation, spreadsheets, Slack, Linear, GitHub, and connection management. While each tool could earn its place in a broad integration hub, the count feels over-scoped for the stated workflow.
Several tools reference operations that are not exposed: gdocs_documents_create points to documents_batch_update for adding content, firecrawl_extract points to extract_status for polling, and linear_issue_create requires teams_list/users_list/workflow_states_list that are absent. Create-only surfaces for Notion, Google Docs, and Sheets lack read/update/delete counterparts, leaving agents with dead ends.
Maintenance
Related MCP Connectors
Agents that watch the sources you approve and write cited Briefs, from your AI tools.
Research layer for AI agents: stock theses, filing Q&A with page cites, monitoring. Research-only.
Investment research superagent: podcasts, SEC filings, and no-code research pipelines.
Web search, scraping, crawling, research, a browser agent, and company and people data.
Related MCP Servers
- AlicenseCqualityCmaintenanceEnables AI agents to run open-source intelligence workflows such as sanctions screening, prioritized vulnerability briefs, IOC searches, evidence-chain verification, and sun-position chronolocation.5MIT
- AlicenseBqualityBmaintenanceEnables freelancers and agencies to run eight back-office workflows across Stripe, Google Drive, Linear, Google Calendar, Gmail, GitHub, Google Docs, Granola, Google Sheets and Firecrawl, covering client onboarding, invoices from calendar and commits, status reports, scope-creep detection, site audits and overdue invoice chasers. Reads run freely, while anything that creates, sends, changes or deletes is shown for approval first, with credentials kept in your own OS keychain and no proxying through any third-party server.28Apache 2.0
- AlicenseBqualityBmaintenanceRuns 13 agent slash-command workflows across Linear, GitHub, Google Docs, Slack, Firecrawl, Sheets, Tavily, Forms, Calendar, Gmail, Stripe, Granola and Notion — turning shipped features into blog and social drafts and handling competitor pricing, mention monitoring, SEO gaps, webinars, newsletters and launch-day tracking. Every credential is your own, kept in the OS keychain or client config, and anything that writes, sends or deletes is shown for approval first.29Apache 2.0
- AlicenseBqualityBmaintenanceEnables an agent to run 20 product-management workflows that convert call notes, specs, customer feedback and competitor changes into deduped Linear issues, PRD drafts, roadmap sheets, digests and weekly project updates. Orchestrates only the tools each workflow needs across Granola, Linear, Slack, Notion, GitHub, Stripe, Firecrawl, Tavily and Google Workspace, using credentials kept in the user's own OS keychain.511Apache 2.0