mirror of
https://github.com/modelcontextprotocol/servers.git
synced 2026-04-19 00:33:22 +02:00
Merge branch 'main' into patch-1
This commit is contained in:
@@ -49,6 +49,7 @@ Official integrations are maintained by companies building production ready MCP
|
|||||||
- <img height="12" width="12" src="https://resources.audiense.com/hubfs/favicon-1.png" alt="Audiense Logo" /> **[Audiense Insights](https://github.com/AudienseCo/mcp-audiense-insights)** - Marketing insights and audience analysis from [Audiense](https://www.audiense.com/products/audiense-insights) reports, covering demographic, cultural, influencer, and content engagement analysis.
|
- <img height="12" width="12" src="https://resources.audiense.com/hubfs/favicon-1.png" alt="Audiense Logo" /> **[Audiense Insights](https://github.com/AudienseCo/mcp-audiense-insights)** - Marketing insights and audience analysis from [Audiense](https://www.audiense.com/products/audiense-insights) reports, covering demographic, cultural, influencer, and content engagement analysis.
|
||||||
- <img height="12" width="12" src="https://axiom.co/favicon.ico" alt="Axiom Logo" /> **[Axiom](https://github.com/axiomhq/mcp-server-axiom)** - Query and analyze your Axiom logs, traces, and all other event data in natural language
|
- <img height="12" width="12" src="https://axiom.co/favicon.ico" alt="Axiom Logo" /> **[Axiom](https://github.com/axiomhq/mcp-server-axiom)** - Query and analyze your Axiom logs, traces, and all other event data in natural language
|
||||||
- <img height="12" width="12" src="https://www.bankless.com/favicon.ico" alt="Bankless Logo" /> **[Bankless Onchain](https://github.com/bankless/onchain-mcp)** - Query Onchain data, like ERC20 tokens, transaction history, smart contract state.
|
- <img height="12" width="12" src="https://www.bankless.com/favicon.ico" alt="Bankless Logo" /> **[Bankless Onchain](https://github.com/bankless/onchain-mcp)** - Query Onchain data, like ERC20 tokens, transaction history, smart contract state.
|
||||||
|
- <img height="12" width="12" src="https://bicscan.io/favicon.png" alt="BICScan Logo" /> **[BICScan](https://github.com/ahnlabio/bicscan-mcp)** - Risk score / asset holdings of EVM blockchain address (EOA, CA, ENS) and even domain names.
|
||||||
- <img height="12" width="12" src="https://www.box.com/favicon.ico" alt="Box Logo" /> **[Box](https://github.com/box-community/mcp-server-box)** - Interact with the Intelligent Content Management platform through Box AI.
|
- <img height="12" width="12" src="https://www.box.com/favicon.ico" alt="Box Logo" /> **[Box](https://github.com/box-community/mcp-server-box)** - Interact with the Intelligent Content Management platform through Box AI.
|
||||||
- <img height="12" width="12" src="https://browserbase.com/favicon.ico" alt="Browserbase Logo" /> **[Browserbase](https://github.com/browserbase/mcp-server-browserbase)** - Automate browser interactions in the cloud (e.g. web navigation, data extraction, form filling, and more)
|
- <img height="12" width="12" src="https://browserbase.com/favicon.ico" alt="Browserbase Logo" /> **[Browserbase](https://github.com/browserbase/mcp-server-browserbase)** - Automate browser interactions in the cloud (e.g. web navigation, data extraction, form filling, and more)
|
||||||
- <img height="12" width="12" src="https://www.chargebee.com/static/resources/brand/favicon.png" /> **[Chargebee](https://github.com/chargebee/agentkit/tree/main/modelcontextprotocol)** - MCP Server that connects AI agents to [Chargebee platform](https://www.chargebee.com).
|
- <img height="12" width="12" src="https://www.chargebee.com/static/resources/brand/favicon.png" /> **[Chargebee](https://github.com/chargebee/agentkit/tree/main/modelcontextprotocol)** - MCP Server that connects AI agents to [Chargebee platform](https://www.chargebee.com).
|
||||||
@@ -73,6 +74,7 @@ Official integrations are maintained by companies building production ready MCP
|
|||||||
- <img height="12" width="12" src="https://cdn.prod.website-files.com/6605a2979ff17b2cd1939cd4/6605a460de47e7596ed84f06_icon256.png" alt="gotoHuman Logo" /> **[gotoHuman](https://github.com/gotohuman/gotohuman-mcp-server)** - Human-in-the-loop platform - Allow AI agents and automations to send requests for approval to your [gotoHuman](https://www.gotohuman.com) inbox.
|
- <img height="12" width="12" src="https://cdn.prod.website-files.com/6605a2979ff17b2cd1939cd4/6605a460de47e7596ed84f06_icon256.png" alt="gotoHuman Logo" /> **[gotoHuman](https://github.com/gotohuman/gotohuman-mcp-server)** - Human-in-the-loop platform - Allow AI agents and automations to send requests for approval to your [gotoHuman](https://www.gotohuman.com) inbox.
|
||||||
- <img height="12" width="12" src="https://grafana.com/favicon.ico" alt="Grafana Logo" /> **[Grafana](https://github.com/grafana/mcp-grafana)** - Search dashboards, investigate incidents and query datasources in your Grafana instance
|
- <img height="12" width="12" src="https://grafana.com/favicon.ico" alt="Grafana Logo" /> **[Grafana](https://github.com/grafana/mcp-grafana)** - Search dashboards, investigate incidents and query datasources in your Grafana instance
|
||||||
- <img height="12" width="12" src="https://framerusercontent.com/images/KCOWBYLKunDff1Dr452y6EfjiU.png" alt="Graphlit Logo" /> **[Graphlit](https://github.com/graphlit/graphlit-mcp-server)** - Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a searchable [Graphlit](https://www.graphlit.com) project.
|
- <img height="12" width="12" src="https://framerusercontent.com/images/KCOWBYLKunDff1Dr452y6EfjiU.png" alt="Graphlit Logo" /> **[Graphlit](https://github.com/graphlit/graphlit-mcp-server)** - Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a searchable [Graphlit](https://www.graphlit.com) project.
|
||||||
|
- <img height="12" width="12" src="https://greptime.com/favicon.ico" alt="Greptime Logo" /> **[GreptimeDB](https://github.com/GreptimeTeam/greptimedb-mcp-server)** - Provides AI assistants with a secure and structured way to explore and analyze data in [GreptimeDB](https://github.com/GreptimeTeam/greptimedb).
|
||||||
- <img height="12" width="12" src="https://img.alicdn.com/imgextra/i3/O1CN01d9qrry1i6lTNa2BRa_!!6000000004364-2-tps-218-200.png" alt="Hologres Logo" /> **[Hologres](https://github.com/aliyun/alibabacloud-hologres-mcp-server)** - Connect to a [Hologres](https://www.alibabacloud.com/en/product/hologres) instance, get table metadata, query and analyze data.
|
- <img height="12" width="12" src="https://img.alicdn.com/imgextra/i3/O1CN01d9qrry1i6lTNa2BRa_!!6000000004364-2-tps-218-200.png" alt="Hologres Logo" /> **[Hologres](https://github.com/aliyun/alibabacloud-hologres-mcp-server)** - Connect to a [Hologres](https://www.alibabacloud.com/en/product/hologres) instance, get table metadata, query and analyze data.
|
||||||
- <img height="12" width="12" src="https://hyperbrowser-assets-bucket.s3.us-east-1.amazonaws.com/Hyperbrowser-logo.png" alt="Hyperbrowsers23 Logo" /> **[Hyperbrowser](https://github.com/hyperbrowserai/mcp)** - [Hyperbrowser](https://www.hyperbrowser.ai/) is the next-generation platform empowering AI agents and enabling effortless, scalable browser automation.
|
- <img height="12" width="12" src="https://hyperbrowser-assets-bucket.s3.us-east-1.amazonaws.com/Hyperbrowser-logo.png" alt="Hyperbrowsers23 Logo" /> **[Hyperbrowser](https://github.com/hyperbrowserai/mcp)** - [Hyperbrowser](https://www.hyperbrowser.ai/) is the next-generation platform empowering AI agents and enabling effortless, scalable browser automation.
|
||||||
- **[IBM wxflows](https://github.com/IBM/wxflows/tree/main/examples/mcp/javascript)** - Tool platform by IBM to build, test and deploy tools for any data source
|
- **[IBM wxflows](https://github.com/IBM/wxflows/tree/main/examples/mcp/javascript)** - Tool platform by IBM to build, test and deploy tools for any data source
|
||||||
@@ -147,6 +149,7 @@ A growing set of community-developed and maintained servers demonstrates various
|
|||||||
- **[AWS S3](https://github.com/aws-samples/sample-mcp-server-s3)** - A sample MCP server for AWS S3 that flexibly fetches objects from S3 such as PDF documents.
|
- **[AWS S3](https://github.com/aws-samples/sample-mcp-server-s3)** - A sample MCP server for AWS S3 that flexibly fetches objects from S3 such as PDF documents.
|
||||||
- **[Azure ADX](https://github.com/pab1it0/adx-mcp-server)** - Query and analyze Azure Data Explorer databases.
|
- **[Azure ADX](https://github.com/pab1it0/adx-mcp-server)** - Query and analyze Azure Data Explorer databases.
|
||||||
- **[Azure DevOps](https://github.com/Vortiago/mcp-azure-devops)** - An MCP server that provides a bridge to Azure DevOps services, enabling AI assistants to query and manage work items.
|
- **[Azure DevOps](https://github.com/Vortiago/mcp-azure-devops)** - An MCP server that provides a bridge to Azure DevOps services, enabling AI assistants to query and manage work items.
|
||||||
|
- **[Baidu AI Search](https://github.com/baidubce/app-builder/tree/master/python/mcp_server/ai_search)** - Web search with Baidu Cloud's AI Search
|
||||||
- **[Base Free USDC Transfer](https://github.com/magnetai/mcp-free-usdc-transfer)** - Send USDC on [Base](https://base.org) for free using Claude AI! Built with [Coinbase CDP](https://docs.cdp.coinbase.com/mpc-wallet/docs/welcome).
|
- **[Base Free USDC Transfer](https://github.com/magnetai/mcp-free-usdc-transfer)** - Send USDC on [Base](https://base.org) for free using Claude AI! Built with [Coinbase CDP](https://docs.cdp.coinbase.com/mpc-wallet/docs/welcome).
|
||||||
* **[Basic Memory](https://github.com/basicmachines-co/basic-memory)** - Local-first knowledge management system that builds a semantic graph from Markdown files, enabling persistent memory across conversations with LLMs.
|
* **[Basic Memory](https://github.com/basicmachines-co/basic-memory)** - Local-first knowledge management system that builds a semantic graph from Markdown files, enabling persistent memory across conversations with LLMs.
|
||||||
- **[BigQuery](https://github.com/LucasHild/mcp-server-bigquery)** (by LucasHild) - This server enables LLMs to inspect database schemas and execute queries on BigQuery.
|
- **[BigQuery](https://github.com/LucasHild/mcp-server-bigquery)** (by LucasHild) - This server enables LLMs to inspect database schemas and execute queries on BigQuery.
|
||||||
@@ -154,6 +157,7 @@ A growing set of community-developed and maintained servers demonstrates various
|
|||||||
- **[Bing Web Search API](https://github.com/leehanchung/bing-search-mcp)** (by hanchunglee) - Server implementation for Microsoft Bing Web Search API.
|
- **[Bing Web Search API](https://github.com/leehanchung/bing-search-mcp)** (by hanchunglee) - Server implementation for Microsoft Bing Web Search API.
|
||||||
- **[Bitable MCP](https://github.com/lloydzhou/bitable-mcp)** (by lloydzhou) - MCP server provides access to Lark Bitable through the Model Context Protocol. It allows users to interact with Bitable tables using predefined tools.
|
- **[Bitable MCP](https://github.com/lloydzhou/bitable-mcp)** (by lloydzhou) - MCP server provides access to Lark Bitable through the Model Context Protocol. It allows users to interact with Bitable tables using predefined tools.
|
||||||
- **[Blender](https://github.com/ahujasid/blender-mcp)** (by ahujasid) - Blender integration allowing prompt enabled 3D scene creation, modeling and manipulation.
|
- **[Blender](https://github.com/ahujasid/blender-mcp)** (by ahujasid) - Blender integration allowing prompt enabled 3D scene creation, modeling and manipulation.
|
||||||
|
- **[browser-use](https://github.com/co-browser/browser-use-mcp-server)** (by co-browser) - browser-use MCP server with dockerized playwright + chromium + vnc. supports stdio & resumable http.
|
||||||
- **[Bsc-mcp](https://github.com/TermiX-official/bsc-mcp)** The first MCP server that serves as the bridge between AI and BNB Chain, enabling AI agents to execute complex on-chain operations through seamless integration with the BNB Chain, including transfer, swap, launch, security check on any token and even more.
|
- **[Bsc-mcp](https://github.com/TermiX-official/bsc-mcp)** The first MCP server that serves as the bridge between AI and BNB Chain, enabling AI agents to execute complex on-chain operations through seamless integration with the BNB Chain, including transfer, swap, launch, security check on any token and even more.
|
||||||
- **[Calculator](https://github.com/githejie/mcp-server-calculator)** - This server enables LLMs to use calculator for precise numerical calculations.
|
- **[Calculator](https://github.com/githejie/mcp-server-calculator)** - This server enables LLMs to use calculator for precise numerical calculations.
|
||||||
- **[CFBD API](https://github.com/lenwood/cfbd-mcp-server)** - An MCP server for the [College Football Data API](https://collegefootballdata.com/).
|
- **[CFBD API](https://github.com/lenwood/cfbd-mcp-server)** - An MCP server for the [College Football Data API](https://collegefootballdata.com/).
|
||||||
@@ -240,6 +244,7 @@ A growing set of community-developed and maintained servers demonstrates various
|
|||||||
- **[Keycloak MCP](https://github.com/ChristophEnglisch/keycloak-model-context-protocol)** - This MCP server enables natural language interaction with Keycloak for user and realm management including creating, deleting, and listing users and realms.
|
- **[Keycloak MCP](https://github.com/ChristophEnglisch/keycloak-model-context-protocol)** - This MCP server enables natural language interaction with Keycloak for user and realm management including creating, deleting, and listing users and realms.
|
||||||
- **[Kibela](https://github.com/kiwamizamurai/mcp-kibela-server)** (by kiwamizamurai) - Interact with Kibela API.
|
- **[Kibela](https://github.com/kiwamizamurai/mcp-kibela-server)** (by kiwamizamurai) - Interact with Kibela API.
|
||||||
- **[kintone](https://github.com/macrat/mcp-server-kintone)** - Manage records and apps in [kintone](https://kintone.com) through LLM tools.
|
- **[kintone](https://github.com/macrat/mcp-server-kintone)** - Manage records and apps in [kintone](https://kintone.com) through LLM tools.
|
||||||
|
- **[Kong Konnect](https://github.com/Kong/mcp-konnect)** - A Model Context Protocol (MCP) server for interacting with Kong Konnect APIs, allowing AI assistants to query and analyze Kong Gateway configurations, traffic, and analytics.
|
||||||
- **[Kubernetes](https://github.com/Flux159/mcp-server-kubernetes)** - Connect to Kubernetes cluster and manage pods, deployments, and services.
|
- **[Kubernetes](https://github.com/Flux159/mcp-server-kubernetes)** - Connect to Kubernetes cluster and manage pods, deployments, and services.
|
||||||
- **[Kubernetes and OpenShift](https://github.com/manusa/kubernetes-mcp-server)** - A powerful Kubernetes MCP server with additional support for OpenShift. Besides providing CRUD operations for any Kubernetes resource, this server provides specialized tools to interact with your cluster.
|
- **[Kubernetes and OpenShift](https://github.com/manusa/kubernetes-mcp-server)** - A powerful Kubernetes MCP server with additional support for OpenShift. Besides providing CRUD operations for any Kubernetes resource, this server provides specialized tools to interact with your cluster.
|
||||||
- **[Langflow-DOC-QA-SERVER](https://github.com/GongRzhe/Langflow-DOC-QA-SERVER)** - A Model Context Protocol server for document Q&A powered by Langflow. It demonstrates core MCP concepts by providing a simple interface to query documents through a Langflow backend.
|
- **[Langflow-DOC-QA-SERVER](https://github.com/GongRzhe/Langflow-DOC-QA-SERVER)** - A Model Context Protocol server for document Q&A powered by Langflow. It demonstrates core MCP concepts by providing a simple interface to query documents through a Langflow backend.
|
||||||
@@ -266,6 +271,7 @@ A growing set of community-developed and maintained servers demonstrates various
|
|||||||
- **[Markdownify](https://github.com/zcaceres/mcp-markdownify-server)** - MCP to convert almost anything to Markdown (PPTX, HTML, PDF, Youtube Transcripts and more)
|
- **[Markdownify](https://github.com/zcaceres/mcp-markdownify-server)** - MCP to convert almost anything to Markdown (PPTX, HTML, PDF, Youtube Transcripts and more)
|
||||||
- **[Mindmap](https://github.com/YuChenSSR/mindmap-mcp-server)** (by YuChenSSR) - A server that generates mindmaps from input containing markdown code.
|
- **[Mindmap](https://github.com/YuChenSSR/mindmap-mcp-server)** (by YuChenSSR) - A server that generates mindmaps from input containing markdown code.
|
||||||
- **[Minima](https://github.com/dmayboroda/minima)** - MCP server for RAG on local files
|
- **[Minima](https://github.com/dmayboroda/minima)** - MCP server for RAG on local files
|
||||||
|
- **[Mobile MCP](https://github.com/mobile-next/mobile-mcp)** (by Mobile Next) - MCP server for Mobile(iOS/Android) automation, app scraping and development using physical devices or simulators/emulators.
|
||||||
- **[MongoDB](https://github.com/kiliczsh/mcp-mongo-server)** - A Model Context Protocol Server for MongoDB.
|
- **[MongoDB](https://github.com/kiliczsh/mcp-mongo-server)** - A Model Context Protocol Server for MongoDB.
|
||||||
- **[MongoDB Lens](https://github.com/furey/mongodb-lens)** - Full Featured MCP Server for MongoDB Databases.
|
- **[MongoDB Lens](https://github.com/furey/mongodb-lens)** - Full Featured MCP Server for MongoDB Databases.
|
||||||
- **[Monday.com](https://github.com/sakce/mcp-server-monday)** - MCP Server to interact with Monday.com boards and items.
|
- **[Monday.com](https://github.com/sakce/mcp-server-monday)** - MCP Server to interact with Monday.com boards and items.
|
||||||
@@ -323,6 +329,7 @@ A growing set of community-developed and maintained servers demonstrates various
|
|||||||
- **[scrapling-fetch](https://github.com/cyberchitta/scrapling-fetch-mcp)** - Access text content from bot-protected websites. Fetches HTML/markdown from sites with anti-automation measures using Scrapling.
|
- **[scrapling-fetch](https://github.com/cyberchitta/scrapling-fetch-mcp)** - Access text content from bot-protected websites. Fetches HTML/markdown from sites with anti-automation measures using Scrapling.
|
||||||
- **[SearXNG](https://github.com/ihor-sokoliuk/mcp-searxng)** - A Model Context Protocol Server for [SearXNG](https://docs.searxng.org)
|
- **[SearXNG](https://github.com/ihor-sokoliuk/mcp-searxng)** - A Model Context Protocol Server for [SearXNG](https://docs.searxng.org)
|
||||||
- **[ServiceNow](https://github.com/osomai/servicenow-mcp)** - A MCP server to interact with a ServiceNow instance
|
- **[ServiceNow](https://github.com/osomai/servicenow-mcp)** - A MCP server to interact with a ServiceNow instance
|
||||||
|
- **[Shopify](https://github.com/GeLi2001/shopify-mcp)** - MCP to interact with Shopify API including order, product, customers and so on.
|
||||||
- **[Siri Shortcuts](https://github.com/dvcrn/mcp-server-siri-shortcuts)** - MCP to interact with Siri Shortcuts on macOS. Exposes all Shortcuts as MCP tools.
|
- **[Siri Shortcuts](https://github.com/dvcrn/mcp-server-siri-shortcuts)** - MCP to interact with Siri Shortcuts on macOS. Exposes all Shortcuts as MCP tools.
|
||||||
- **[Snowflake](https://github.com/isaacwasserman/mcp-snowflake-server)** - This MCP server enables LLMs to interact with Snowflake databases, allowing for secure and controlled data operations.
|
- **[Snowflake](https://github.com/isaacwasserman/mcp-snowflake-server)** - This MCP server enables LLMs to interact with Snowflake databases, allowing for secure and controlled data operations.
|
||||||
- **[Solana Agent Kit](https://github.com/sendaifun/solana-agent-kit/tree/main/examples/agent-kit-mcp-server)** - This MCP server enables LLMs to interact with the Solana blockchain with help of Solana Agent Kit by SendAI, allowing for 40+ protcool actions and growing
|
- **[Solana Agent Kit](https://github.com/sendaifun/solana-agent-kit/tree/main/examples/agent-kit-mcp-server)** - This MCP server enables LLMs to interact with the Solana blockchain with help of Solana Agent Kit by SendAI, allowing for 40+ protcool actions and growing
|
||||||
@@ -333,6 +340,7 @@ A growing set of community-developed and maintained servers demonstrates various
|
|||||||
- **[Tavily search](https://github.com/RamXX/mcp-tavily)** - An MCP server for Tavily's search & news API, with explicit site inclusions/exclusions
|
- **[Tavily search](https://github.com/RamXX/mcp-tavily)** - An MCP server for Tavily's search & news API, with explicit site inclusions/exclusions
|
||||||
- **[Telegram](https://github.com/chigwell/telegram-mcp)** - An MCP server that provides paginated chat reading, message retrieval, and message sending capabilities for Telegram through Telethon integration.
|
- **[Telegram](https://github.com/chigwell/telegram-mcp)** - An MCP server that provides paginated chat reading, message retrieval, and message sending capabilities for Telegram through Telethon integration.
|
||||||
- **[Terminal-Control](https://github.com/GongRzhe/terminal-controller-mcp)** - A MCP server that enables secure terminal command execution, directory navigation, and file system operations through a standardized interface.
|
- **[Terminal-Control](https://github.com/GongRzhe/terminal-controller-mcp)** - A MCP server that enables secure terminal command execution, directory navigation, and file system operations through a standardized interface.
|
||||||
|
- **[TFT-Match-Analyzer](https://github.com/GeLi2001/tft-mcp-server)** - MCP server for teamfight tactics match history & match details fetching, providing user the detailed context for every match.
|
||||||
- **[Ticketmaster](https://github.com/delorenj/mcp-server-ticketmaster)** - Search for events, venues, and attractions through the Ticketmaster Discovery API
|
- **[Ticketmaster](https://github.com/delorenj/mcp-server-ticketmaster)** - Search for events, venues, and attractions through the Ticketmaster Discovery API
|
||||||
- **[Todoist](https://github.com/abhiz123/todoist-mcp-server)** - Interact with Todoist to manage your tasks.
|
- **[Todoist](https://github.com/abhiz123/todoist-mcp-server)** - Interact with Todoist to manage your tasks.
|
||||||
- **[Typesense](https://github.com/suhail-ak-s/mcp-typesense-server)** - A Model Context Protocol (MCP) server implementation that provides AI models with access to Typesense search capabilities. This server enables LLMs to discover, search, and analyze data stored in Typesense collections.
|
- **[Typesense](https://github.com/suhail-ak-s/mcp-typesense-server)** - A Model Context Protocol (MCP) server implementation that provides AI models with access to Typesense search capabilities. This server enables LLMs to discover, search, and analyze data stored in Typesense collections.
|
||||||
|
|||||||
@@ -107,6 +107,10 @@ ModelContextProtocol/1.0 (User-Specified; +https://github.com/modelcontextprotoc
|
|||||||
|
|
||||||
This can be customized by adding the argument `--user-agent=YourUserAgent` to the `args` list in the configuration.
|
This can be customized by adding the argument `--user-agent=YourUserAgent` to the `args` list in the configuration.
|
||||||
|
|
||||||
|
### Customization - Proxy
|
||||||
|
|
||||||
|
The server can be configured to use a proxy by using the `--proxy-url` argument.
|
||||||
|
|
||||||
## Debugging
|
## Debugging
|
||||||
|
|
||||||
You can use the MCP inspector to debug the server. For uvx installations:
|
You can use the MCP inspector to debug the server. For uvx installations:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "mcp-server-fetch"
|
name = "mcp-server-fetch"
|
||||||
version = "0.6.2"
|
version = "0.6.3"
|
||||||
description = "A Model Context Protocol server providing tools to fetch and convert web content for usage by LLMs"
|
description = "A Model Context Protocol server providing tools to fetch and convert web content for usage by LLMs"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.10"
|
requires-python = ">=3.10"
|
||||||
@@ -16,6 +16,7 @@ classifiers = [
|
|||||||
"Programming Language :: Python :: 3.10",
|
"Programming Language :: Python :: 3.10",
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"httpx<0.28",
|
||||||
"markdownify>=0.13.1",
|
"markdownify>=0.13.1",
|
||||||
"mcp>=1.1.3",
|
"mcp>=1.1.3",
|
||||||
"protego>=0.3.1",
|
"protego>=0.3.1",
|
||||||
|
|||||||
@@ -15,9 +15,10 @@ def main():
|
|||||||
action="store_true",
|
action="store_true",
|
||||||
help="Ignore robots.txt restrictions",
|
help="Ignore robots.txt restrictions",
|
||||||
)
|
)
|
||||||
|
parser.add_argument("--proxy-url", type=str, help="Proxy URL to use for requests")
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
asyncio.run(serve(args.user_agent, args.ignore_robots_txt))
|
asyncio.run(serve(args.user_agent, args.ignore_robots_txt, args.proxy_url))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ def get_robots_txt_url(url: str) -> str:
|
|||||||
return robots_url
|
return robots_url
|
||||||
|
|
||||||
|
|
||||||
async def check_may_autonomously_fetch_url(url: str, user_agent: str) -> None:
|
async def check_may_autonomously_fetch_url(url: str, user_agent: str, proxy_url: str | None = None) -> None:
|
||||||
"""
|
"""
|
||||||
Check if the URL can be fetched by the user agent according to the robots.txt file.
|
Check if the URL can be fetched by the user agent according to the robots.txt file.
|
||||||
Raises a McpError if not.
|
Raises a McpError if not.
|
||||||
@@ -72,7 +72,7 @@ async def check_may_autonomously_fetch_url(url: str, user_agent: str) -> None:
|
|||||||
|
|
||||||
robot_txt_url = get_robots_txt_url(url)
|
robot_txt_url = get_robots_txt_url(url)
|
||||||
|
|
||||||
async with AsyncClient() as client:
|
async with AsyncClient(proxies=proxy_url) as client:
|
||||||
try:
|
try:
|
||||||
response = await client.get(
|
response = await client.get(
|
||||||
robot_txt_url,
|
robot_txt_url,
|
||||||
@@ -109,14 +109,14 @@ async def check_may_autonomously_fetch_url(url: str, user_agent: str) -> None:
|
|||||||
|
|
||||||
|
|
||||||
async def fetch_url(
|
async def fetch_url(
|
||||||
url: str, user_agent: str, force_raw: bool = False
|
url: str, user_agent: str, force_raw: bool = False, proxy_url: str | None = None
|
||||||
) -> Tuple[str, str]:
|
) -> Tuple[str, str]:
|
||||||
"""
|
"""
|
||||||
Fetch the URL and return the content in a form ready for the LLM, as well as a prefix string with status information.
|
Fetch the URL and return the content in a form ready for the LLM, as well as a prefix string with status information.
|
||||||
"""
|
"""
|
||||||
from httpx import AsyncClient, HTTPError
|
from httpx import AsyncClient, HTTPError
|
||||||
|
|
||||||
async with AsyncClient() as client:
|
async with AsyncClient(proxies=proxy_url) as client:
|
||||||
try:
|
try:
|
||||||
response = await client.get(
|
response = await client.get(
|
||||||
url,
|
url,
|
||||||
@@ -173,19 +173,22 @@ class Fetch(BaseModel):
|
|||||||
bool,
|
bool,
|
||||||
Field(
|
Field(
|
||||||
default=False,
|
default=False,
|
||||||
description="Get the actual HTML content if the requested page, without simplification.",
|
description="Get the actual HTML content of the requested page, without simplification.",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
async def serve(
|
async def serve(
|
||||||
custom_user_agent: str | None = None, ignore_robots_txt: bool = False
|
custom_user_agent: str | None = None,
|
||||||
|
ignore_robots_txt: bool = False,
|
||||||
|
proxy_url: str | None = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Run the fetch MCP server.
|
"""Run the fetch MCP server.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
custom_user_agent: Optional custom User-Agent string to use for requests
|
custom_user_agent: Optional custom User-Agent string to use for requests
|
||||||
ignore_robots_txt: Whether to ignore robots.txt restrictions
|
ignore_robots_txt: Whether to ignore robots.txt restrictions
|
||||||
|
proxy_url: Optional proxy URL to use for requests
|
||||||
"""
|
"""
|
||||||
server = Server("mcp-fetch")
|
server = Server("mcp-fetch")
|
||||||
user_agent_autonomous = custom_user_agent or DEFAULT_USER_AGENT_AUTONOMOUS
|
user_agent_autonomous = custom_user_agent or DEFAULT_USER_AGENT_AUTONOMOUS
|
||||||
@@ -229,10 +232,10 @@ Although originally you did not have internet access, and were advised to refuse
|
|||||||
raise McpError(ErrorData(code=INVALID_PARAMS, message="URL is required"))
|
raise McpError(ErrorData(code=INVALID_PARAMS, message="URL is required"))
|
||||||
|
|
||||||
if not ignore_robots_txt:
|
if not ignore_robots_txt:
|
||||||
await check_may_autonomously_fetch_url(url, user_agent_autonomous)
|
await check_may_autonomously_fetch_url(url, user_agent_autonomous, proxy_url)
|
||||||
|
|
||||||
content, prefix = await fetch_url(
|
content, prefix = await fetch_url(
|
||||||
url, user_agent_autonomous, force_raw=args.raw
|
url, user_agent_autonomous, force_raw=args.raw, proxy_url=proxy_url
|
||||||
)
|
)
|
||||||
original_length = len(content)
|
original_length = len(content)
|
||||||
if args.start_index >= original_length:
|
if args.start_index >= original_length:
|
||||||
@@ -259,7 +262,7 @@ Although originally you did not have internet access, and were advised to refuse
|
|||||||
url = arguments["url"]
|
url = arguments["url"]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
content, prefix = await fetch_url(url, user_agent_manual)
|
content, prefix = await fetch_url(url, user_agent_manual, proxy_url=proxy_url)
|
||||||
# TODO: after SDK bug is addressed, don't catch the exception
|
# TODO: after SDK bug is addressed, don't catch the exception
|
||||||
except McpError as e:
|
except McpError as e:
|
||||||
return GetPromptResult(
|
return GetPromptResult(
|
||||||
|
|||||||
@@ -8,7 +8,10 @@ A Model Context Protocol server that provides browser automation capabilities us
|
|||||||
|
|
||||||
- **puppeteer_navigate**
|
- **puppeteer_navigate**
|
||||||
- Navigate to any URL in the browser
|
- Navigate to any URL in the browser
|
||||||
- Input: `url` (string)
|
- Inputs:
|
||||||
|
- `url` (string, required): URL to navigate to
|
||||||
|
- `launchOptions` (object, optional): PuppeteerJS LaunchOptions. Default null. If changed and not null, browser restarts. Example: `{ headless: true, args: ['--user-data-dir="C:/Data"'] }`
|
||||||
|
- `allowDangerous` (boolean, optional): Allow dangerous LaunchOptions that reduce security. When false, dangerous args like `--no-sandbox`, `--disable-web-security` will throw errors. Default false.
|
||||||
|
|
||||||
- **puppeteer_screenshot**
|
- **puppeteer_screenshot**
|
||||||
- Capture screenshots of the entire page or specific elements
|
- Capture screenshots of the entire page or specific elements
|
||||||
@@ -61,6 +64,7 @@ The server provides access to two types of resources:
|
|||||||
- Screenshot capabilities
|
- Screenshot capabilities
|
||||||
- JavaScript execution
|
- JavaScript execution
|
||||||
- Basic web interaction (navigation, clicking, form filling)
|
- Basic web interaction (navigation, clicking, form filling)
|
||||||
|
- Customizable Puppeteer launch options
|
||||||
|
|
||||||
## Configuration to use Puppeteer Server
|
## Configuration to use Puppeteer Server
|
||||||
Here's the Claude Desktop configuration to use the Puppeter server:
|
Here's the Claude Desktop configuration to use the Puppeter server:
|
||||||
@@ -93,6 +97,39 @@ Here's the Claude Desktop configuration to use the Puppeter server:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Launch Options
|
||||||
|
|
||||||
|
You can customize Puppeteer's browser behavior in two ways:
|
||||||
|
|
||||||
|
1. **Environment Variable**: Set `PUPPETEER_LAUNCH_OPTIONS` with a JSON-encoded string in the MCP configuration's `env` parameter:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"mcp-puppeteer": {
|
||||||
|
"command": "npx",
|
||||||
|
"args": ["-y", "@modelcontextprotocol/server-puppeteer"],
|
||||||
|
"env": {
|
||||||
|
"PUPPETEER_LAUNCH_OPTIONS": "{ \"headless\": false, \"executablePath\": \"C:/Program Files/Google/Chrome/Application/chrome.exe\", \"args\": [] }",
|
||||||
|
"ALLOW_DANGEROUS": "true"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Tool Call Arguments**: Pass `launchOptions` and `allowDangerous` parameters to the `puppeteer_navigate` tool:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"url": "https://example.com",
|
||||||
|
"launchOptions": {
|
||||||
|
"headless": false,
|
||||||
|
"defaultViewport": {"width": 1280, "height": 720}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
Docker build:
|
Docker build:
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ const TOOLS: Tool[] = [
|
|||||||
inputSchema: {
|
inputSchema: {
|
||||||
type: "object",
|
type: "object",
|
||||||
properties: {
|
properties: {
|
||||||
url: { type: "string" },
|
url: { type: "string", description: "URL to navigate to" },
|
||||||
|
launchOptions: { type: "object", description: "PuppeteerJS LaunchOptions. Default null. If changed and not null, browser restarts. Example: { headless: true, args: ['--no-sandbox'] }" },
|
||||||
|
allowDangerous: { type: "boolean", description: "Allow dangerous LaunchOptions that reduce security. When false, dangerous args like --no-sandbox will throw errors. Default false." },
|
||||||
},
|
},
|
||||||
required: ["url"],
|
required: ["url"],
|
||||||
},
|
},
|
||||||
@@ -101,16 +103,65 @@ const TOOLS: Tool[] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Global state
|
// Global state
|
||||||
let browser: Browser | undefined;
|
let browser: Browser | null;
|
||||||
let page: Page | undefined;
|
let page: Page | null;
|
||||||
const consoleLogs: string[] = [];
|
const consoleLogs: string[] = [];
|
||||||
const screenshots = new Map<string, string>();
|
const screenshots = new Map<string, string>();
|
||||||
|
let previousLaunchOptions: any = null;
|
||||||
|
|
||||||
|
async function ensureBrowser({ launchOptions, allowDangerous }: any) {
|
||||||
|
|
||||||
|
const DANGEROUS_ARGS = [
|
||||||
|
'--no-sandbox',
|
||||||
|
'--disable-setuid-sandbox',
|
||||||
|
'--single-process',
|
||||||
|
'--disable-web-security',
|
||||||
|
'--ignore-certificate-errors',
|
||||||
|
'--disable-features=IsolateOrigins',
|
||||||
|
'--disable-site-isolation-trials',
|
||||||
|
'--allow-running-insecure-content'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Parse environment config safely
|
||||||
|
let envConfig = {};
|
||||||
|
try {
|
||||||
|
envConfig = JSON.parse(process.env.PUPPETEER_LAUNCH_OPTIONS || '{}');
|
||||||
|
} catch (error: any) {
|
||||||
|
console.warn('Failed to parse PUPPETEER_LAUNCH_OPTIONS:', error?.message || error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deep merge environment config with user-provided options
|
||||||
|
const mergedConfig = deepMerge(envConfig, launchOptions || {});
|
||||||
|
|
||||||
|
// Security validation for merged config
|
||||||
|
if (mergedConfig?.args) {
|
||||||
|
const dangerousArgs = mergedConfig.args?.filter?.((arg: string) => DANGEROUS_ARGS.some((dangerousArg: string) => arg.startsWith(dangerousArg)));
|
||||||
|
if (dangerousArgs?.length > 0 && !(allowDangerous || (process.env.ALLOW_DANGEROUS === 'true'))) {
|
||||||
|
throw new Error(`Dangerous browser arguments detected: ${dangerousArgs.join(', ')}. Fround from environment variable and tool call argument. ` +
|
||||||
|
'Set allowDangerous: true in the tool call arguments to override.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ((browser && !browser.connected) ||
|
||||||
|
(launchOptions && (JSON.stringify(launchOptions) != JSON.stringify(previousLaunchOptions)))) {
|
||||||
|
await browser?.close();
|
||||||
|
browser = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
browser = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
previousLaunchOptions = launchOptions;
|
||||||
|
|
||||||
async function ensureBrowser() {
|
|
||||||
if (!browser) {
|
if (!browser) {
|
||||||
const npx_args = { headless: false }
|
const npx_args = { headless: false }
|
||||||
const docker_args = { headless: true, args: ["--no-sandbox", "--single-process", "--no-zygote"] }
|
const docker_args = { headless: true, args: ["--no-sandbox", "--single-process", "--no-zygote"] }
|
||||||
browser = await puppeteer.launch(process.env.DOCKER_CONTAINER ? docker_args : npx_args);
|
browser = await puppeteer.launch(deepMerge(
|
||||||
|
process.env.DOCKER_CONTAINER ? docker_args : npx_args,
|
||||||
|
mergedConfig
|
||||||
|
));
|
||||||
const pages = await browser.pages();
|
const pages = await browser.pages();
|
||||||
page = pages[0];
|
page = pages[0];
|
||||||
|
|
||||||
@@ -126,6 +177,31 @@ async function ensureBrowser() {
|
|||||||
return page!;
|
return page!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deep merge utility function
|
||||||
|
function deepMerge(target: any, source: any): any {
|
||||||
|
const output = Object.assign({}, target);
|
||||||
|
if (typeof target !== 'object' || typeof source !== 'object') return source;
|
||||||
|
|
||||||
|
for (const key of Object.keys(source)) {
|
||||||
|
const targetVal = target[key];
|
||||||
|
const sourceVal = source[key];
|
||||||
|
if (Array.isArray(targetVal) && Array.isArray(sourceVal)) {
|
||||||
|
// Deduplicate args/ignoreDefaultArgs, prefer source values
|
||||||
|
output[key] = [...new Set([
|
||||||
|
...(key === 'args' || key === 'ignoreDefaultArgs' ?
|
||||||
|
targetVal.filter((arg: string) => !sourceVal.some((launchArg: string) => arg.startsWith('--') && launchArg.startsWith(arg.split('=')[0]))) :
|
||||||
|
targetVal),
|
||||||
|
...sourceVal
|
||||||
|
])];
|
||||||
|
} else if (sourceVal instanceof Object && key in target) {
|
||||||
|
output[key] = deepMerge(targetVal, sourceVal);
|
||||||
|
} else {
|
||||||
|
output[key] = sourceVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
mcpHelper: {
|
mcpHelper: {
|
||||||
@@ -136,7 +212,7 @@ declare global {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleToolCall(name: string, args: any): Promise<CallToolResult> {
|
async function handleToolCall(name: string, args: any): Promise<CallToolResult> {
|
||||||
const page = await ensureBrowser();
|
const page = await ensureBrowser(args);
|
||||||
|
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case "puppeteer_navigate":
|
case "puppeteer_navigate":
|
||||||
@@ -285,15 +361,15 @@ async function handleToolCall(name: string, args: any): Promise<CallToolResult>
|
|||||||
window.mcpHelper.logs.push(`[${method}] ${args.join(' ')}`);
|
window.mcpHelper.logs.push(`[${method}] ${args.join(' ')}`);
|
||||||
(window.mcpHelper.originalConsole as any)[method](...args);
|
(window.mcpHelper.originalConsole as any)[method](...args);
|
||||||
};
|
};
|
||||||
} );
|
});
|
||||||
} );
|
});
|
||||||
|
|
||||||
const result = await page.evaluate( args.script );
|
const result = await page.evaluate(args.script);
|
||||||
|
|
||||||
const logs = await page.evaluate(() => {
|
const logs = await page.evaluate(() => {
|
||||||
Object.assign(console, window.mcpHelper.originalConsole);
|
Object.assign(console, window.mcpHelper.originalConsole);
|
||||||
const logs = window.mcpHelper.logs;
|
const logs = window.mcpHelper.logs;
|
||||||
delete ( window as any).mcpHelper;
|
delete (window as any).mcpHelper;
|
||||||
return logs;
|
return logs;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user