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 Docsrun 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: MCP OSINT Server
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.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | The app to connect. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=false, so the description carries real weight: it discloses that key-based apps surface where to get a key plus a terminal command, while Google starts an OAuth browser flow that 'returns at once' and works on the next call. That interactive, deferred-completion behavior is meaningful context absent from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then behavior per app type, then the sibling pointer and constraint. Every sentence carries information, though the Google flow sentence is a touch dense. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param mutation tool with no output schema, the description covers the key behavioral cases (key entry vs OAuth), the immediate-return semantics of the Google path, and how to verify state via `connection_status`. It omits failure handling, but is otherwise complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum lists all apps, so the baseline is 3. The description adds value beyond the raw enum by grouping apps into 'key-issuing' vs OAuth (Google) categories and explaining what each implies, giving the `app` parameter semantic meaning the schema alone does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Connect one app this server uses'), so the action is unambiguous. It also names the relevant sibling, `connection_status`, so an agent can tell the connect action apart from the status-check action. It stops short of naming the other siblings, but those are app-specific tools unrelated to this operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'To see which apps are connected, call `connection_status`,' and adds a hard constraint, 'Never ask the user for a key in the chat.' It gives clear context for when/how to call, though it doesn't spell out refusal or retry conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_statusARead-only
See which apps this server is connected to, and how to connect each one that is not. Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered by structured data. 'Changes nothing' restates the readOnly hint rather than adding new behavior; the only incremental value is noting that connect instructions are returned for unconnected apps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the primary purpose and appends the secondary benefit with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, read-only status tool with no output schema, the description covers both what is inspected and the shape of the useful payload (connect guidance). Return format details are absent but minimal given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly implies no input is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('See') and resource ('which apps this server is connected to'), and adds the secondary payload of connect instructions for missing apps. This distinguishes it from the sibling 'connect' tool, which performs the connection rather than reporting status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'how to connect each one that is not' implies this tool is the discovery step before using 'connect', but the sibling is never named and there is no explicit when-to-use/when-not statement. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_crawlC
Recursively crawl a website and scrape each discovered page.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The base URL to start crawling from | |
| delay | No | Delay in seconds between scrapes. Setting this forces concurrency to 1. | |
| limit | No | Maximum number of pages to crawl. The server applies 10000 when this is absent. | |
| prompt | No | Natural language prompt to generate crawler options from. | |
| sitemap | No | Sitemap mode when crawling. The server applies 'include' when this is absent. | |
| webhook | No | Webhook specification for crawl lifecycle events. | |
| excludePaths | No | URL pathname regex patterns that exclude matching URLs from the crawl. | |
| includePaths | No | URL pathname regex patterns that include matching URLs in the crawl. | |
| scrapeOptions | No | Options applied when scraping each crawled page. | |
| maxConcurrency | No | Maximum number of concurrent scrapes for this crawl. | |
| regexOnFullURL | No | Match includePaths and excludePaths against the full URL instead of just the pathname. | |
| allowSubdomains | No | Allow the crawler to follow links to subdomains of the main domain. | |
| ignoreRobotsTxt | No | Ignore the website's robots.txt rules. Enterprise only. | |
| robotsUserAgent | No | Custom User-Agent string for robots.txt evaluation. Enterprise only. | |
| crawlEntireDomain | No | Allow the crawler to follow internal links to sibling or parent URLs, not just child paths. | |
| maxDiscoveryDepth | No | Maximum depth to crawl based on discovery order. | |
| zeroDataRetention | No | If true, this will enable zero data retention for this crawl. | |
| allowExternalLinks | No | Allow the crawler to follow links to external websites (one hop only). | |
| ignoreQueryParameters | No | Do not re-scrape the same path with different query parameters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, so the description need only add context, and it adds none. It omits that this kicks off an asynchronous crawl job (a firecrawl_crawl_status sibling exists for polling), that pages/credits are consumed, and that a limit defaults to 10000.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is efficient, though its brevity is partly under-specification rather than true economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter, open-world, non-read-only crawl tool with no output schema, the description is far too thin. It says nothing about asynchronous job behavior, polling via crawl_status, scope controls (allowSubdomains, includePaths), or cost, all of which an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the 19 parameters are fully documented in the schema. The description contributes no additional parameter meaning, which is the baseline-3 case when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'recursively crawl a website and scrape each discovered page.' The word 'recursively' and 'each discovered page' implicitly distinguish it from the single-page firecrawl_scrape sibling, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no when-to-use guidance, no conditions selecting it over firecrawl_scrape, firecrawl_map, or firecrawl_extract, and no prerequisites. The agent must infer usage purely from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_extractA
Extract structured data from one or more URLs using an LLM. Poll results with extract_status.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | The URLs to extract data from. URLs should be in glob format. | |
| prompt | No | Prompt to guide the extraction process. | |
| schema | No | Schema to define the structure of the extracted data. Must conform to JSON Schema. | |
| showSources | No | When true, the sources used to extract the data will be included in the response as `sources`. | |
| ignoreSitemap | No | When true, sitemap.xml files will be ignored during website scanning. | |
| scrapeOptions | No | Options applied when scraping pages for extraction. | |
| enableWebSearch | No | When true, the extraction will use web search to find additional data. | |
| threatProtection | No | Per-request threat protection override. Enterprise feature. | |
| ignoreInvalidURLs | No | If invalid URLs are specified, they are ignored and returned in invalidURLs instead of failing the request. The server applies true when this is absent. | |
| includeSubdomains | No | When true, subdomains of the provided URLs will also be scanned. The server applies true when this is absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, openWorldHint=true) are minimal and do not reveal the async job lifecycle, so the description correctly surfaces the most important behavioral trait: results must be polled via extract_status. It stops there, omitting what the initial call returns (a job id?), failure behavior, and whether web-search/credit costing applies. Decent added context over annotations, but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero waste. The core purpose is front-loaded and the polling instruction follows immediately. Nothing to trim and nothing misplaced.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, no output schema, and an async job model, the description covers the poll step but not the full lifecycle: it does not explain what the initial invocation returns or how to correlate extract_status results back to it. For a complex async tool with no output schema to fall back on, this is a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 10 parameters (urls, prompt, schema, scrapeOptions, enableWebSearch, etc.) are already documented in the schema. The description adds no parameter-level detail (e.g., the glob URL format or JSON Schema requirement) beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Extract structured data from one or more URLs') and adds the key mechanism ('using an LLM'), so the agent understands this is LLM-driven structured extraction rather than raw scraping. It does not, however, distinguish itself from the very close sibling firecrawl_scrape, leaving the boundary between the two to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence ('Poll results with extract_status') is genuine usage guidance: it tells the agent this is an async operation that must be polled. But it gives no guidance on when to choose this tool over firecrawl_scrape or other extraction options, and does not name any exclusion criteria. Usage is implied rather than fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_checks_listCRead-onlyIdempotent
List checks for a monitor.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum checks to return. The server applies 25 when this is absent. | |
| offset | No | Number of checks to skip. The server applies 0 when this is absent. | |
| status | No | Filter checks by status. | |
| monitorId | Yes | The monitor ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered externally. The description adds nothing beyond them: no note on ordering, pagination behavior, or what a check record contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero padding. It is efficient, though its brevity borders on under-specification for a tool with paging and status filters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool whose schema fully documents its four parameters and whose annotations cover safety, this is roughly adequate. It omits return-shape or ordering context, but with no output schema and a simple contract, that gap is modest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself documents limit (default 25), offset (default 0), status enum values, and monitorId. The one-line description contributes no additional parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (checks) scoped to a monitor, which is enough to distinguish it from firecrawl_monitor_create. It does not, however, explicitly contrast itself with any sibling tool, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use guidance, no prerequisites, and no alternatives. An agent must infer from the name alone that this is the read path for monitor check history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_monitor_createB
Create a scheduled monitor for scrape, crawl, or search targets.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | Plain-language goal used to judge whether changed pages are meaningful. | |
| name | Yes | Monitor name. | |
| targets | Yes | Targets to run on each check. | |
| webhook | No | Webhook destination for monitor events. | |
| schedule | Yes | Schedule for monitor checks. | |
| judgeEnabled | No | Whether to judge changed pages against goal. | |
| notification | No | Notification destinations. | |
| retentionDays | No | How long to retain monitor history. The server applies 30 when this is absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true, so the mutation and external-reach profile is already covered; the description's 'create' is consistent with these and adds no contradiction. It adds only the notion that the created object is scheduled/recurring, but says nothing about lifecycle, cost, or persistence beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, correctly leading with the verb and the resource. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex creation tool with required schedule/targets, nested target union types, webhooks, notifications, retention, and an optional judge/goal mechanism, and no output schema to fall back on. The one-line description does not explain what a monitor does over time or what happens after creation, leaving significant gaps for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 8 parameters (schedule, targets, webhook, judgeEnabled, notification, retentionDays, goal, name) are already documented in the schema. The description adds no syntax or format detail beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a scheduled monitor') and scopes it to the three target kinds the schema supports (scrape, crawl, search). It implicitly separates this from the one-off firecrawl_scrape/firecrawl_crawl siblings via 'scheduled,' but never names them, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites (e.g. that monitors run repeatedly and incur ongoing credit usage), and no pointer to alternatives like firecrawl_crawl or firecrawl_crawl_status for one-off jobs. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_research_paper_getARead-onlyIdempotent
Inspect metadata or read passages from a research paper.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Passage count for read mode. Only valid when query is present. The server applies 4 when this is absent. | |
| id | Yes | Paper reference: a canonical paperId or source-specific primaryId. | |
| query | No | When present, returns top matching full-text passages for this question. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds the useful fact that there are two distinct behaviors (metadata vs passage reading), but does not disclose mode-selection rules, limits, or return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler, front-loading the two capabilities. Nothing is wasted and the essential action is stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries some burden for explaining returns, yet it only broadly says metadata or passages. The schema compensates for parameter behavior, but the two-mode contract and what each mode returns are only minimally conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents that query returns matching passages, k sets passage count (defaulting to 4), and id is a paperId or primaryId. The description adds no parameter meaning beyond this, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (inspect/read) and resource (research paper) and outlines two modes: metadata inspection and passage reading. It is clear what the tool does, though it does not explicitly differentiate itself from the sibling firecrawl_research_papers_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two operating modes are implied, and the schema hints that passing a query triggers read mode, but the description never states when to use this tool versus firecrawl_research_papers_search or when to prefer metadata vs passage reading. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firecrawl_research_papers_searchCRead-onlyIdempotent
Search the research paper index with natural-language queries.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Maximum number of ranked papers to return. The server applies 40 when this is absent. | |
| to | No | Inclusive upper bound on created/updated date. | |
| from | No | Inclusive lower bound on created/updated date. | |
| query | Yes | Natural-language paper search query. | |
| authors | No | Author substring filter. Repeat or pass a comma-separated value. | |
| categories | No | Paper category filter. Repeat or pass a comma-separated value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld, so the safety profile is covered by structured data. The description adds nothing beyond that — no note on ranking behavior, result caps, pagination, or what happens when the index has no match.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler and the core action first. It is efficient, though so terse that it borders on under-specification rather than disciplined conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All six parameters are documented in the schema and annotations cover the read-only safety profile, so the basics are in place. With no output schema and no description of return shape, ranking semantics, or default result count, an agent still lacks enough to predict what it gets back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's phrase 'natural-language queries' merely restates the query parameter's own schema description and adds no meaning for k, from/to, authors, or categories.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the research paper index') plus the query mode ('natural-language'). It does not, however, distinguish itself from the sibling firecrawl_research_paper_get or from the broader tavily_search, so an agent must infer which search surface to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use, when-not-to-use, or alternative routing guidance. The presence of firecrawl_research_paper_get and tavily_search among siblings makes the absence of any 'use this instead of X when Y' statement a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to scrape | |
| proxy | No | Specifies the type of proxy to use. | |
| maxAge | No | Returns a cached version of the page if it is younger than this age in milliseconds. The server applies 172800000 (2 days) when this is absent. | |
| minAge | No | When set, the request only checks the cache and never triggers a fresh scrape. | |
| mobile | No | Emulate scraping from a mobile device. | |
| actions | No | Actions to perform on the page before grabbing the content. | |
| formats | No | Output formats to include in the response. Strings or objects. The server applies markdown when this is absent. | |
| headers | No | Headers to send with the request. | |
| parsers | No | Controls how files are processed during scraping. | |
| profile | No | Persistent browser storage across scrape and interact sessions. | |
| timeout | No | Timeout in milliseconds. The server applies 60000 when this is absent. | |
| waitFor | No | Specify a delay in milliseconds before fetching the content. The server applies 0 when this is absent. | |
| blockAds | No | Enables ad-blocking and cookie popup blocking. | |
| location | No | Location settings for the request. | |
| lockdown | No | Serve from cache only and never make an outbound request. On miss, returns 404 SCRAPE_LOCKDOWN_CACHE_MISS. | |
| redactPII | No | Redact personally identifiable information from returned markdown. Pass true for defaults, or an object to tune it. | |
| excludeTags | No | Tags to exclude from the output. | |
| includeTags | No | Tags to include in the output. | |
| storeInCache | No | If true, the page will be stored in the Firecrawl index and cache. | |
| auditMetadata | No | User attribution included with SIEM logging events when SIEM is enabled. | |
| onlyMainContent | No | Only return the main content of the page excluding headers, navs, footers, etc. The server applies true when this is absent. | |
| onlyCleanContent | No | Beta. LLM pass over markdown to remove residual boilerplate that onlyMainContent can miss. | |
| threatProtection | No | Per-request threat protection override. Enterprise feature. | |
| zeroDataRetention | No | If true, this will enable zero data retention for this scrape. To enable this feature, please contact help@firecrawl.dev | |
| removeBase64Images | No | Removes all base64 images from the markdown output. | |
| skipTlsVerification | No | Skip TLS certificate verification when making requests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, so the agent knows this touches external state. The description adds the supported output formats, which is useful, but it omits behavior implied by the schema — that actions (click/write/executeJavascript) mutate the page, that storeInCache writes to an external index, and that some features cost credits. Nothing contradicts the annotations, but the added behavioral detail is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core purpose front-loaded and no filler. The trailing format list is somewhat redundant with the schema's formats enum, which keeps it short of ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a 26-parameter tool with no output schema and only minimal annotations, yet the description is three sentences long. It omits cost/credit implications, caching/lockdown semantics, the relationship to firecrawl_extract, and any hint of what the response looks like, so an agent invoking it correctly still depends almost entirely on reading the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 26 parameters are already documented in-schema and the baseline is 3. The description echoes the formats dimension ('markdown, HTML, screenshots, structured JSON extraction') but adds no format syntax, precedence, or interaction detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Scrape a single URL') plus an optional outgrowth ('optionally extract information'), so an agent can tell it is a per-URL content fetcher. The phrase 'a single URL' gestures at the multi-URL alternative but never names firecrawl_extract, so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one clear trigger ('Use when the user wants to read or summarize a specific webpage'), which is real usage guidance. But it never states when NOT to use it, nor does it point to firecrawl_extract for bulk/structured extraction, so the routing decision against the closest sibling is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The document to create. Only the title is honoured. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=true, so the description carries the behavioral load and does well: it discloses the critical constraint that only the title is honoured and the document is created empty. It also notes the documentId is returned, which matters with no output schema. It stops short of noting auth/permission or quota behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, zero padding, and the most important constraint (empty document, title-only) is front-loaded before the follow-up instructions. Every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by mentioning the returned documentId and the batch_update follow-up, which is what an agent needs to chain calls. For a single-param mutation tool with annotations covering the safety profile, this is nearly complete; only auth/error behavior is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the title field already states it is the only honoured field, so the description largely restates structured data. Baseline 3 applies; the emphasis on the empty-document effect is useful but not new information beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) and resource (document), and immediately disambiguates the scope: it produces a blank/empty document, not a content-bearing one. This is a distinct action an agent can tell apart from content-writing operations. The mention of documents_batch_update further fixes its place in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear sequencing guidance: to add content, create first and then call documents_batch_update with the returned documentId. It does not state explicit exclusions or alternatives (e.g., when to use a copy/template flow instead), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | The name of the repository without the `.git` extension. The name is not case sensitive. | |
| owner | Yes | The account owner of the repository. The name is not case sensitive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint, idempotentHint and openWorldHint already covering the safety profile, the description still earns credit by disclosing the return shape (an object keyed by language) and the absence of pagination, which matters since no output schema exists. It does not mention auth requirements or rate limits, so it is not fully exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tightly written sentence that front-loads the action and resource, then appends the two facts an agent needs (bytes per language, no paging). Zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with a fully documented schema and no output schema, the description supplies everything missing: what it returns, its keying, and that there is no pagination to handle. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both required parameters (owner, repo) are documented in the schema, so the baseline is 3. The description adds no formatting or case-sensitivity guidance beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (a repository's languages) and adds the payload detail (bytes of code each). An agent immediately knows this is the language-breakdown read, distinct from the GitHub search tools among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for use — 'the quickest way to find out what a repository is written in before reading any of it' — which tells the agent when this tool is the right first step. It does not, however, name an alternative tool or state exclusions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_search_repositoriesARead-onlyIdempotent
Search repositories with qualifiers, e.g. 'topic:cli language:go stars:>500'. Rate limited to 30 requests per minute.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | The query containing one or more search keywords and qualifiers, e.g. `tetris language:assembly stars:>100`. Qualifiers include `language:`, `stars:`, `forks:`, `topic:`, `org:`, `user:`, `license:`. | |
| page | No | The page number of the results to fetch. Defaults to 1. | |
| sort | No | Sorts the results by number of stars, forks, help-wanted issues, or how recently the items were updated. Default: best match. | |
| order | No | Determines whether the first search result returned is the highest number of matches (`desc`) or lowest (`asc`). Ignored unless `sort` is provided. GitHub uses `desc` when this is absent. | |
| perPage | No | The number of results per page (max 100). Defaults to 30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, open-world, and idempotent behavior. The description adds a valuable operational constraint: a rate limit of 30 requests per minute, which is not available from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no waste. The purpose and example are front-loaded, followed by the rate limit. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and annotations are rich, and the description adds a key rate-limit detail. It is nearly complete for a search tool, though it could note that results are paginated or what the response contains if an agent needed that reassurance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters and qualifier syntax. The description's example query is consistent with the schema but does not add meaning beyond it, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: search repositories. The example query with qualifiers makes the scope unambiguous and distinguishes it from sibling tools like github_search_commits or github_repos_list_languages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the tool name and description, but there is no explicit when-to-use or when-not-to-use guidance, nor any comparison to alternatives such as github_repos_list_languages or tavily_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsheets_spreadsheets_values_updateC
Sets values in a range of a spreadsheet.
| Name | Required | Description | Default |
|---|---|---|---|
| range | Yes | The A1 notation of the values to update. | |
| valueRange | Yes | The request body contains an instance of ValueRange. | |
| spreadsheetId | Yes | The ID of the spreadsheet to update. | |
| valueInputOption | Yes | How the input data should be interpreted. | |
| includeValuesInResponse | No | Determines if the update response should include the values of the cells that were updated. By default, responses do not include the updated values. If the range to write was larger than the range actually written, the response includes all values in the requested range (excluding trailing empty rows and columns). | |
| responseValueRenderOption | No | Determines how values in the response should be rendered. The default render option is FORMATTED_VALUE. | |
| responseDateTimeRenderOption | No | Determines how dates, times, and durations in the response should be rendered. This is ignored if responseValueRenderOption is FORMATTED_VALUE. The default dateTime render option is SERIAL_NUMBER. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true, so the write nature is known. But the description adds nothing beyond the name – it does not disclose that existing cell values are overwritten, how valueInputOption affects interpretation, or what the update returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, which is tight. But for a 7-parameter mutation tool it is under-specified rather than appropriately sized; conciseness here is closer to omission.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with 7 params and no output schema, the description omits overwrite semantics, auth requirements, and response behavior. An agent could call it, but not safely without reading the schema closely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with 7 well-documented parameters, so the schema carries the meaning. The description adds no parameter detail beyond 'in a range', which is baseline 3 for fully documented schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (sets values in a range of a spreadsheet), which an agent can distinguish from gsheets_spreadsheets_values_get by direction of data flow. However it offers no explicit sibling differentiation and largely restates the tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of the sibling gsheets_spreadsheets_values_get or when reading vs writing applies. The agent must infer context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| variables | Yes | The request to record. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=true. The description adds a genuinely useful behavioral trait that no structured field conveys: the response carries no object and only indicates success/failure, which is important given there is no output schema. It stops short of mentioning permission or side-effect details, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no waste. The core action is front-loaded, and the second sentence efficiently conveys the unusual no-object return without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create mutation with annotations covering the safety profile and no output schema, the description covers the key agent-facing concerns: what it does and what it returns. The main gap is the absence of usage/permission context, which keeps it below a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter (including the nested input object fields) is fully documented in the schema. The description only lightly gestures at the attachment options ('an issue or project'), adding little beyond what the schema already provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Record') and resource ('customer request'), which cleanly distinguishes it from linear_issue_create and linear_search_issues in the sibling list. It could go further by explicitly naming the alternative tool, but the operation and target object are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no alternative tool is named. The phrase 'optionally attached to an issue or project' implies a relationship to those areas but does not help an agent decide between this tool and linear_issue_create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| variables | Yes | The issue to create. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, so the mutation/external-scope profile is covered. The description adds genuinely useful behavior: Linear rejects names and only accepts UUIDs resolved via teams_list/users_list/workflow_states_list, and parent_id turns this into a sub-issue creation. It stops short of noting side effects like notifications or returned identity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and the required fields, followed by the ID-resolution constraint and the sub-issue tip. No filler, though the UUID guidance partially duplicates the schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create tool whose one parameter is a deeply nested object fully documented by the schema, plus annotations covering the safety profile, the description covers the essentials an agent needs. It lacks any mention of what creation returns, which is a minor gap given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every field including the resolver-tool hints and the sub-issue semantics. The description's parameter notes (team_id/title required, everything else optional) largely restate the schema rather than adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create an issue'), which is instantly distinguishable from the list-oriented sibling linear_issues_list. It does not explicitly name a sibling it is not, so it falls short of a 5, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical invocation guidance (required vs optional fields, which resolver tools supply UUIDs, how to make a sub-issue) but never states when to reach for this tool versus alternatives such as linear_issues_list, nor any exclusion or prerequisite conditions. Usage is implied rather than framed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| variables | Yes | What to search for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds genuinely useful behavioral context beyond them: the search spans titles and descriptions, and comment text is only included when include_comments is set. No return-format or pagination detail, but the schema's `after`/`first` params cover that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the tool does, then the one parameter worth calling out, then the routing rule. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only search wrapper whose input schema documents every field, the description supplies exactly the missing layer: search scope, the include_comments toggle, and when to prefer the sibling. Nothing an agent needs in order to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description still adds real meaning: it defines the search surface (titles and descriptions) and explains the effect of include_comments rather than restating its schema text. It does not, however, reconcile that guidance with the presence of a `filter` object in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (search) plus resource (issues) plus the exact searchable fields (titles and descriptions). It explicitly names the sibling it is not (issues_list) and characterizes itself as full-text, so an agent can separate it from filter-based listing without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the alternative and the selecting condition: use issues_list to filter on fields such as state or assignee. That is clear routing guidance, though it slightly undersells the tool's own `filter` parameter, which the schema shows can narrow results on top of the text match.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The page to create. | |
| filterProperties | No | Property IDs to return on the page that comes back, instead of all of them. A page that does not have a listed property omits it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, establishing this as an external write. The description adds the meaningful markdown/template mutual exclusion. It does not disclose auth requirements, rate limits, or the allowAsync async-202 behavior, but with annotations carrying the safety profile a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with the verb and the two modes, with the exclusivity constraint phrased crisply. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex creation tool with a fully documented schema, the description covers parent selection and content sourcing adequately. It omits the async task path (allowAsync → 202) and return shape, but with no output schema and 100% schema coverage these are minor gaps, and annotations cover the write semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value: it clarifies that `parent` takes `data_source_id` to make a database row and that template vs. markdown are mutually exclusive — beyond the schema's raw field docs. It doesn't add detail on `properties` or `filterProperties`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a page') and immediately delineates the two creation modes — subpage vs. database row — which is exactly what separates it from siblings like notion_pages_update. An agent can identify the tool's scope without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance: use a page parent for a subpage, `data_source_id` for a database row, and content comes from `markdown` OR a template, 'never both.' The mutual-exclusion rule is explicit. However, it names no sibling alternatives (e.g., update vs. create routing) and states no prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | The main body text of the message. Required unless blocks or attachments are provided. Used as the fallback string for notifications when blocks are provided, so it is worth setting even then. | |
| parse | No | Change how messages are treated. Accepts 'none' or 'full'. | |
| blocks | No | A JSON-based array of structured Block Kit blocks. | |
| mrkdwn | No | Disable Slack markup parsing by setting to false. Defaults to true. | |
| channel | Yes | An encoded ID or channel name that represents a channel, private group, or IM channel to send the message to. Prefer the encoded ID (e.g. 'C123ABC456'). | |
| iconUrl | No | URL to an image to use as the icon for this message. Requires the chat:write.customize scope. | |
| metadata | No | Application-specific metadata to attach to the message. | |
| threadTs | No | Provide another message's 'ts' value to make this message a reply in that thread. Avoid using a reply's ts value; use the parent's. | |
| username | No | Set the bot's user name. Requires the chat:write.customize scope. | |
| iconEmoji | No | Emoji to use as the icon for this message, e.g. ':chart_with_upwards_trend:'. Requires the chat:write.customize scope. | |
| linkNames | No | Find and link user groups. | |
| attachments | No | A JSON-based array of structured attachments. | |
| unfurlLinks | No | Pass true to enable unfurling of primarily text-based content. | |
| unfurlMedia | No | Pass false to disable unfurling of media content. | |
| markdownText | No | Accepts message text formatted in markdown. Limit this field to 12,000 characters. Cannot be used together with blocks or text. | |
| replyBroadcast | No | Used in conjunction with thread_ts and indicates whether the reply should be made visible to everyone in the channel. Defaults to false. | |
| unfurlAppLinks | No | Pass true to enable unfurling of links to installed apps. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, so the write/external nature is covered. The description adds the threading behavior, but does not disclose required scopes, rate limits, message-size limits, or what a successful send returns — and most scope info already lives in the schema parameter descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and then the two most important parameter behaviors. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter tool with no output schema, the description is thin but the schema carries full parameter documentation, so an agent can call it correctly. Missing behavioral context (rate limits, required scopes, response shape) keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 17 parameters are documented in the schema itself. The description's notes on `text` and `thread_ts` largely restate what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Send') and resource ('a message to a Slack channel, private group, or DM'), making the action and destination unambiguous. An agent can distinguish this from siblings like slack_conversations_create without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives implied usage for `text` and `thread_ts`, but there is no explicit when-to-use vs. when-not, no mention of prerequisites (e.g. chat:write scope), and no reference to alternative messaging tools such as gmail_messages_send. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tavily_research_createA
Create an async research task that searches, analyzes sources, and generates a cited report. Poll results with research_get.
| Name | Required | Description | Default |
|---|---|---|---|
| files | No | Attach up to 5 files as additional sources. Each file may be at most 80,000 words; combined total at most 80,000 words. | |
| input | Yes | Research task or question. | |
| model | No | Research agent model tier. The server applies `auto` when this is absent. | |
| outputLength | No | Target response size. The server applies `standard` when this is absent. | |
| outputSchema | No | JSON Schema defining structured output shape. | |
| citationFormat | No | Citation format in the report. The server applies `numbered` when this is absent. | |
| excludeDomains | No | Hard blocklist (max 20). Downward subdomain matching only. | |
| includeDomains | No | Soft source preference (max 20). Host-based subdomain matching. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true, so the safety profile is partly covered. The description adds important behavioral context beyond annotations: the task is asynchronous and results must be polled via research_get. It does not cover potential costs, rate limits, or task persistence, but the async/polling disclosure is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and immediately followed by the essential polling instruction. No filler or repetition; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 8-parameter tool with no output schema, the description covers the key behavioral facts: it creates an async task that produces a cited report, and results are retrieved with research_get. It omits details about return shape or parameter nuances, but those are either in the schema or in the sibling polling tool, making the description largely complete for its purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 8 parameters are fully documented in the schema. The description adds no parameter-specific meaning (e.g., it does not explain input, files, or model tiers). Baseline 3 is appropriate when the schema already carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Create') and resource ('async research task'), and explains the action chain: searches, analyzes sources, and generates a cited report. It differentiates from the sibling tavily_research_get by pointing to polling, but does not explicitly distinguish itself from tavily_search, leaving a small gap in sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through 'Create an async research task...' and gives the follow-up action 'Poll results with research_get.' However, it does not state when to choose this over alternatives like tavily_search, nor any preconditions or exclusions. Usage is only partially implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| requestId | Yes | Research task UUID returned by `research_create`. | |
| includeUsage | No | Include credit usage in the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, open-world, and idempotent characteristics. The description adds useful behavioral detail beyond those annotations by explaining the HTTP 202 in-progress status and the need to poll until HTTP 200.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no wasted words. The purpose is front-loaded, followed immediately by the key polling behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter polling tool with full schema coverage and no output schema, the description covers the essential purpose and polling semantics. It does not describe the shape of returned results, but with no output schema that omission is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both requestId and includeUsage are already documented in the input schema. The description mentions request_id but adds no syntax, format, or usage detail beyond what the schema provides, making this baseline-level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve') and resource ('status and results of a research task') with the lookup key ('request_id'). It is clear enough to distinguish from generic search tools, though it does not explicitly name the sibling tavily_research_create as the origin of the request_id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational guidance for polling: HTTP 202 means still running, and the agent should poll until HTTP 200. It does not explicitly say when not to use this tool or name alternatives, but the intended context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query to execute. | |
| topic | No | Search category. The server applies `general` when this is absent. `news` automatically enables `include_published_date`. | |
| country | No | Boost results from a country using Tavily's lowercase English country name (for example `united states`). Available only when `topic` is `general`. | |
| endDate | No | Return results before this date (`YYYY-MM-DD`). | |
| language | No | Boost or filter results by language — an ISO 639-1 code (for example `en`, `fr`, `zh-cn`) or English language name (for example `english`, `french`). | |
| startDate | No | Return results after this date (`YYYY-MM-DD`). | |
| timeRange | No | Filter by publish or last-updated date window. | |
| exactMatch | No | Return only results containing the exact quoted phrase(s) in the query. | |
| maxResults | No | Maximum search results to return. The server applies 10 when this is absent. | |
| safeSearch | No | Filter adult or unsafe content. Not supported when `search_depth` is `fast` or `ultra-fast`. | |
| searchDepth | No | Latency/relevance tradeoff. The server applies `basic` when this is absent. `advanced` costs 2 credits; `basic`, `fast` and `ultra-fast` cost 1 credit. | |
| includeUsage | No | Include credit usage in the response. | |
| includeAnswer | No | Include an LLM-generated answer. `true` or `basic` returns a quick answer; `advanced` returns a detailed answer. The server applies `false` when this is absent. | |
| includeImages | No | Include query-related images and per-result `images`. | |
| autoParameters | No | Let Tavily configure parameters from the query. Explicit values override auto-selected ones. `include_answer`, `include_raw_content` and `max_results` must always be set manually when using this. | |
| excludeDomains | No | Domains to exclude (max 150). | |
| includeDomains | No | Domains to include (max 300). | |
| includeFavicon | No | Include a favicon URL per result. | |
| chunksPerSource | No | Maximum relevant chunks per source in each result's `content`. The server applies 3 when this is absent. Available only when `search_depth` is `advanced`, `basic` or `fast`. Each chunk is at most 500 characters and joined with `[...]`. | |
| filterByLanguage | No | Strictly filter out non-matching languages. Requires `language`. | |
| includeRawContent | No | Include cleaned page content per result. `true` or `markdown` returns markdown; `text` returns plain text and may increase latency. The server applies `false` when this is absent. | |
| includeDomainsMode | No | How `include_domains` is applied. Requires `include_domains` to be set. | |
| includePublishedDate | No | Include `published_date` on each result. Beta feature. Automatically enabled when `topic` is `news`. | |
| filterByPublishedDate | No | Remove results outside the date window or with no detectable date. Also enables `include_published_date`. | |
| includeImageDescriptions | No | Add descriptive text per image when `include_images` is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true, which is an unusual pairing for a read-only search and is left unexplained. The description adds a config recommendation (search_depth advanced, chunks_per_source 3) but doesn't clarify the credit costs or why a read-only operation isn't marked read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: what it does, when to use it, and an actionable configuration tip. Front-loaded and zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a large but fully documented 25-parameter schema with no output schema, the description covers the essential purpose, usage trigger, and a key tuning recommendation. It's adequate, though the odd readOnlyHint=false on a search tool could have been addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 25 parameters is already documented in the schema. The description names two parameters and their preferred values without adding semantics beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Execute a real-time web search') and scopes it ('optimized for AI agents'). It distinguishes itself from tavily_research_create by being a real-time search vs. a research task, though it never explicitly names that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage trigger: 'Use when sources are unknown or current web context is needed.' This tells the agent when to reach for it over knowledge-only answers, though it doesn't name alternatives like firecrawl_scrape or tavily_research_create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
21 tool updates
v0.1.0- First observed
connect - First observed
connection_status - First observed
firecrawl_crawl - First observed
firecrawl_extract - First observed
firecrawl_monitor_checks_list - First observed
firecrawl_monitor_create - First observed
firecrawl_research_paper_get - First observed
firecrawl_research_papers_search - First observed
firecrawl_scrape - First observed
gdocs_documents_create - First observed
github_repos_list_languages - First observed
github_search_repositories - First observed
gsheets_spreadsheets_values_update - First observed
linear_customer_need_create - First observed
linear_issue_create - First observed
linear_search_issues - First observed
notion_pages_create - First observed
slack_chat_post_message - First observed
tavily_research_create - First observed
tavily_research_get - First observed
tavily_search
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
Investment research superagent: podcasts, SEC filings, and no-code research pipelines.
30+ marketing data tools for AI agents: keywords, SERP, backlinks, AI visibility, app store & commerce intelligence, Reddit/LinkedIn/Facebook/YouTube research, web search, page extraction, site audit, image & video generation, one-shot marketing apps. Bring your own API key from supamarketers.com — per-tool pricing in Credits.
Curated operational knowledge for AI agents. 2 tools. Paid.
Hosted AI agents and workflows with app OAuth, human approval gates, and a run ledger.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables coding agents to run local-first web research: intent-routed search across independent engines with reranking, a multi-stage fetch/crawl ladder, and document extraction. Results come back as signed-cursor, citation-bearing evidence envelopes, with an optional separately enabled profile for browser click/type actions.AGPL 3.0
- 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
- AlicenseNot gradedqualityBmaintenanceEnables 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.Apache 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